1.如果编译时指定了-L选项,就优先到-L指定的路径去查找库进行连接;
2.查找GCC的环境变量LIBRARY_PATH
3.到/bin /usr/lib /usr/local/lib去查找。这几个搜索路径在gcc下是默认的。
所以当我们要让自己添加的库文件让gcc能搜索到,有两种方法,一种就是用-L指定,一种就是将库复制到以上几个gcc默认搜索路径。
二、run-time库搜索路径
1.编译时用-Wl, -rpath指定的路径
Ex:
arm-none-linux-gnueabi-gcc -o helloword_arm helloword.c -Wl,-dynamic-linker=/system/lib/ld-linux.so.3,-rpath,/system/lib/
2.环境变量LD_LIBRARY_PATH指定的路径
3./etc/ld.so.conf指定的路径
4.默认的动态搜索库路径/lib /usr/lib
LIBRARY_PATH和LD_LIBRARY_PATH是Linux下的两个环境变量,二者的含义和作用分别如下:
LIBRARY_PATH环境变量用于在程序编译期间查找动态链接库时指定查找共享库的路径,例如,指定gcc编译需要用到的动态链接库的目录。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LIBRARY_PATH=LIBDIR1:LIBDIR2:$LIBRARY_PATH
LD_LIBRARY_PATH环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。设置方法如下(其中,LIBDIR1和LIBDIR2为两个库目录):
export LD_LIBRARY_PATH=LIBDIR1:LIBDIR2:$LD_LIBRARY_PATH
举个例子,我们开发一个程序,经常会需要使用某个或某些动态链接库,为了保证程序的可移植性,可以先将这些编译好的动态链接库放在自己指定的目录下,然后按照上述方式将这些目录加入到LD_LIBRARY_PATH环境变量中,这样自己的程序就可以动态链接后加载库文件运行了。
区别与使用:
开发时,设置LIBRARY_PATH,以便gcc能够找到编译时需要的动态链接库。
发布时,设置LD_LIBRARY_PATH,以便程序加载运行时能够自动找到需要的动态链接库。
三、几个重要的命令
1)ldd bin_name
可以查看编译出来的可执行文件依赖的库。部署程序时,我们要把这些库拷贝出来,然后将这些库连同可执行文件拷贝到新的机器上,在/etc/ld.so.conf.d下添加对应的库文件搜索路径即可。
2.ldconfig命令
搜索/lib和/usr/lib以及/etc/ld.so.conf下列出来的所有路径的库,然后创建动态库的cache文件。当程序需要搜索库时就会搜索ld.so.cache里列出来的库。
所以当我们向系统添加新的库文件时,除了需要把库文件烤到/usr/local/lib等指定位置外,还需ldconfig一下来更新cache文件。
四、gcc头文件的搜索路径
1.优先搜索-I指定的路径
2.查找GCC的环境变量C_INCLUDE_PATH/CPLUS_INCLUDE_PATH/OBJC_INCLUDE_PATH指定的路径
3.查找默认的搜索路径/usr/include /usr/local/include
所有GCC的环境变量,我们都可以GCC的原有搜索路径上上面添加进我们自己的路径,例如
#增加.so搜索路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home//lib
#增加.a搜索路径
LIBRARY_PATH=$LIBRARY_PATH:/home/lib
#增加bin搜索路径
export PATH=$PATH:/home/bin
#增加GCC的include文件搜索路径
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/home/include
-wall -pedantic
-wall编译时显示所有的警告信息,可以增加程序的健壮性和可移植性
-pedantic,以符合ANSI/ISO C 标准列出所有警告
首先纠正一下,编译器并不通过头文件找源文件,头文件里只有声明,include是在预处理阶段,就是直接把头文件代码粘贴到你写的.c文件中,接下来编译器编译生成目标文件,你说的库文件我的理解应该是头文件对应的源文件吧,这个过程其实是发生在链接阶段,头文件对应的源文件早就编译成目标文件做成静态链接库或者动态链接库,和你写的目标文件一起链接成可执行程序第二个问题 为什么用头文件做中介
前面已经说过头文件里只有声明,试想一下如果不用头文件,声明和定义都放在一个文件中,那么你去include库文件的时候他会把里面所有的函数声明和函数原型都包含进来,一个库文件中可能包含几十个函数,而这些函数你可能只用到其中的一两个,一个函数有可能几百行代码,这样你的.c文件不是额外多了好几千行代码
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)