库文件是只有连接(静态库和共享库)和运行)共享库的程序,静态库与可执行文件一起编译其搜索路径在系统中设置。 在典型的Linux系统上,使用/lib和/usr/lib两个目录作为缺省库搜索路径,以便在使用这两个目录中的库时可以直接使用它们,而无需设置搜索路径。 对于非默认库搜索路径的库,必须将库位置添加到库搜索路径中。
要设置库文件的搜索路径,通常有以下几种方法:
环境变量,如LIBRARY_PATH和LD_LIBRARY_PATH :指定连接和运行库文件路径; /etc/ld.so.conf文件:添加链接时库文件的搜索路径。 在运行时,必须使用ldconfig命令将路径更新为ld.so.cache。 g /gcc参数-L、-L和-I :指定链接时库文件的路径、名称和头文件。 在运行时,必须使用环境变量,或者在/etc/ld.so.conf文件中指定环境变量,或者将其放到缺省/lib路径中。 然后,ldconfig; 接下来,分为连接、运行的不同阶段分别进行解读吧。 参见: 0.2动态链接,静态链接. note
1、环境变量:
将以下环境变量添加到/etc/profile中:
1 )编译时使用的环境变量:
#找到gcc头文件的路径c _ include _ path=/usr/include/libxml 23360/mylibexportc _ include _ path # g找到头文件的路径CPP 在编译的链接(link )阶段,mylibexportcplus _ include _ path # gcc和g表示库文件的目录列表library _ path=$ library _ path
#在程序运行时查找ku文件的路径LD _ library _ path=$ LD _ library _ path :/mylibexportld _ library _ path3)示例:
创建头文件my_so_test.h和两个源文件test1.cpp、test2.cpp,并创建名为libmytest.so的动态链接库文件。
3.1 )先用$ g-olibmytest.so-shared-fpic test1.CPP test2. CPP建立动态链接库;
3.2 )为main.cpp调用创建动态连接库:
#include 'my_so.h'int main () { test1 ); test2(; 返回0; }编译,连接:
解决方案: vim /etc/profile,添加以下内容,然后单击source /etc/profile :
library _ path=$ LD _ library _ path :/home/roo/xsd RS/test6/soexportlibrary _ path随后编译,连接: $ g-orurue
3.3 )运行:
vim /etc/profile,添加以下内容,然后source /etc/profile
LD _ library _ path=$ LD _ library _ path :/home/roo/xsd RS/test6/soexportld _ library _ path随后为./run
2、/etc/ld.so.conf 文件:
将库文件的所有路径添加到/etc/ld.so.conf是雪白花瓣的选择,添加方法也很简单,每行一个,例如:
完成/usr/x11r6/lib/usr/local/lib/opt/lib的添加后,仅添加链接不会产生错误,在运行之前,请使用ldconfig命令刷新ld.so.cache
如:果然如上例
2.1 )连接:
将动态库复制到系统的默认库路径时,编译链接将通过。 或在/etc/ld.so.conf中添加/home/roo/xsdrs/test6/so行
2.2 )运行:
解决方案:运行ldconfig之后可以正常运行。
3、gcc/g++参数:
尝试在上面的示例中指定-L,-L,-I (头文件中的)参数。
1 )编译,连接:
$ g -o run main.cpp -L./-lmytest
说明:使用-L参数指定库文件地址-L指定动态库的名称;
2 )运行:
3 )解决:
使用LD_LIBRARY_PATH环境变量,或在/etc/ld.so.conf文件中指定库文件路径,然后在ldconfig中刷新ld.so.cache。
默认库文件路径、头文件路径
1、显示默认库文件路径:
gcc----打印搜索- dirg----打印搜索- dir
2、查看默认头文件(包括)的路径:
` gcc-print-Prog-name=cc1 plus `-v ` g-print-Prog-name=cc1 plus `-v