gcc杂谈
1. -l选项自动给库文件名增加lib前缀和.a/.so后缀。所以如果你有一个lib叫做libusb.a,那么编译选项是-lusb。另一方面,如果你有一个文件叫做libusb.o(是目标文件而不是库文件),并希望将其作为库的形式使用,那么使用-llibusb.o。
2. pkg-config
这玩意自动给你的gcc命令行加上相关的lib和include位置选项。例如:
gcc -o test test.c ·pkg-config --libs --cflags glib-2.0·
附上pkg-config项目自己给出的介绍:
pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use gcc -o test test.c pkg-config --libs --cflags glib-2.0 for instance, rather than hard-coding values on where to find glib (or other libraries). It is language-agnostic, so it can be used for defining the location of documentation tools, for instance.
3. ldconfig
Linux在加载应用程序的时候,并不直接加载共享库,而是由/lib/ld.so来干这个事情。ld.so在标准路径(/lib,/usr/lib)中寻找共享库。But,如果.so在非标路径,ld.so就抓虾了。所以,我们需要将非标路径加入/etc/ld.so.conf,然后运行ldconfig生成/etc/ld.so.cache。ld.so加载共享库的时候,会从ld.so.cache查找(但不会理睬ld.so.conf!)。
4. 静态库和动态库
4.1 静态库的生成
使用gcc -c生成.o文件,然后使用ar归档为.a文件。
4.2 静态库的使用
4.2.1 直接将.a作为源代码交给gcc:
gcc x.c libmy.a -o myelf
4.2.2 通过指定库文件位置:
gcc -o myelf x.c -LYOUR_LIB_PATH -lmy
4.3 动态库的生成
gcc -o libmy.so -shared my.o [-fPIC]
所生成的.so同时用于编译和执行。
4.4 -fPIC
-fPIC选项生成位置无关代码,即.so内的代码和数据在使用时不需要重定位,但也因为此,只能通过got(global offset table)间接寻址。如果不使用-fPIC,.so在使用时必须进行重定位,为每个使用该库的进程都在物理内存中复制一份副本,因为需要修改其中的地址。
4.5 动态库的使用
4.5.1 直接将.so交给gcc
gcc x.c libmy.so -o myelf
这种方法生成的ELF文件中包含编译时so文件所在的位置,在执行时要求so文件处于相同位置。
4.5.2 使用-L和-l指定.so位置
gcc -o myelf x.c -LYOUR_LIB_PATH -lmy
4.5.3 使用dlopen在应用程序执行时加载
参考http://www.ibm.com/developerworks/cn/linux/l-dynamic-libraries/index.html
4.5.4 其他
上面我们说过,.so同时用于编译和执行,但编译和执行时的查找方式和顺序是不一样的(嗯,在历史上曾经一样过)。
编译时gcc的查找顺序:
- LIBRARY_PATH(仅对native编译器有效,对cross compiler无效)
- -L -l指定位置
- 标准位置
执行时ld.so的查找顺序:
- LD_LIBRARY_PATH
- 标准位置
- ld.so.cache指定位置
4.6 可以通过ldd查看某个应用程序需要哪些动态库
gcc杂谈的更多相关文章
- Linux杂谈: gcc对结构体大小的默认处理方式
1. 发现问题 最近在编写代码过程中发现,对一个结构体进行 sizeof 操作时,有时候大小是填充过的,有时候又没有填充. 那么,如果在代码中没有显示的指定要求编译器进行对齐时,gcc的默认处理是怎样 ...
- 子树大小平衡树(Size Balanced Tree,SBT)操作模板及杂谈
基础知识(包括但不限于:二叉查找树是啥,SBT又是啥反正又不能吃,平衡树怎么旋转,等等)在这里就不(lan)予(de)赘(duo)述(xie)了. 先贴代码(数组模拟): int seed; int ...
- VSCode调试go语言出现:exec: "gcc": executable file not found in %PATH%
1.问题描述 由于安装VS15 Preview 5,搞的系统由重新安装一次:在用vscdoe编译go语言时,出现以下问题: # odbcexec: "gcc": executabl ...
- GCC学习(1)之MinGW使用
GCC学习(1)之MinGW使用 因为后续打算分享一些有关GCC的使用心得的文章,就把此篇当作一个小预热,依此来了解下使用GNU工具链(gcc.gdb.make等)在脱离IDE的情况下如何开发以及涉及 ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- [异常解决] How to build a gcc toolchain for nRF51 on linux (very detailed!!!)
1.Install gcc-arm-none-eabi https://devzone.nordicsemi.com/tutorials/7/This link shows that developm ...
- CentOS 6.6 升级GCC G++ (当前最新版本为v6.1.0) (完整)
---恢复内容开始--- CentOS 6.6 升级GCC G++ (当前最新GCC/G++版本为v6.1.0) 没有便捷方式, yum update.... yum install 或者 添加y ...
- GCC 预处理、编译、汇编、链接..
1简介 GCC 的意思也只是 GNU C Compiler 而已.经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言:它现在还支持 Ada 语言.C++ 语言.Java 语言.Objective ...
- 用gcc进行程序的编译
在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...
随机推荐
- Tomcat发布网站知识集锦
修改端口.修改默认发布目录.多域名绑定 一.修改发布端口号为80(Tomcat默认为8080) 打开配置文件(我的如下:E:\J2EEServer\Tomcat 6.0\conf\server.xml ...
- spark中streamingContext的使用详解
两种创建方式 val conf = new SparkConf().setAppName(appName).setMaster(master);val ssc = new StreamingConte ...
- scala言语基础学习八
- Java基础相关
对老师上课内容进行总结: 1.新建一个Java项目,并命名为HelloWorld 然后再新建类,并命名为HelloWorld,注意红色画圈部分 若勾选,则新建类开头为(“//后的内容为老师所讲批注”) ...
- hihoCoder #1040 (判断是否为矩形)
题目大意:给四条线段,问能否构成一个矩形? 题目分析:先判断能否构成四边形,然后选一条边,看另外三条边中是否为一条与他平行,两条垂直. 代码如下: # include<iostream> ...
- AFN网络状态的时时监控以及网络的判断、
//3.判断网络状况 AFNetworkReachabilityManager *netManager = [AFNetworkReachabilityManager sharedManager ...
- JS原型链原理(链表)
任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__ 当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表..在数据结 ...
- GDB调试器
/*this project used for gdb debug c programs*//*At first,using compile command turn out the executab ...
- Java——线程间通信问题
wait和sleep区别: 1.wait可以指定时间可以不指定. sleep必须指定时间. 2.在同步时,对cpu的执行权和锁的处理不同. wait:释放执行权,释放锁. ...
- DNS与DSN
dns是域名系统的缩写 dsn在一些专业书籍中是数据源的缩写