linux源码安装和库文件的一些经验(三)

来源:互联网 发布:水电预算软件下载 编辑:程序博客网 时间:2024/04/30 06:58

工具或者方法主要有

1.pkg-config工具。

   为系统提供在编译,预编译时所需库及头文件位置及版本等信息,信息存储在库.pc文件,pc文件必须被pkg-config找到才能向系统提供信息,.pc 文件的搜索路径是通过环境变量 PKG_CONFIG_PATH 来设置的,pkg-config 将按照设置路径的先后顺序进行搜索,直到找到指定的 .pc 文件为止。ubuntu下默认的搜索路径包括/usr/lib/pkgconfig和/usr/local/lib/pkgconfig/,如果新装库的pc文件在其他位置,新装完 库 后,在 bash 中应该进行如下设置:

$ export PKG_CONFIG_PATH=/opt/gtk/lib/pkgconfig:$PKG_CONFIG_PATH或者把该库的pc文件cp进前面所说的两个默认目录(一般新装库make install的时候已经自动这么做了)

 

2.在环境变量 LD_LIBRARY_PATH 中指明链接库的搜索路径

(嵌入式系统常用)。


3.在  /etc/ld.so.conf  文件中添加库的搜索路径并使用ldconfig命令更新cache

(PC机常用)。

----------------------------------------------------------------------------分割线----------------------------------------------------------------------------------
 

     2和3功能类似,都是为系统提供编译及运行时所需要的库信息。

    configure时能找到库但是make 时却找不到,执行ldconfig就找到了。

    有时候,系统明明已经有了某个库,但是./configure的时候却提示没有,那很有可能是因为configure是使用pkg-config去查找相关库信息,所以需要将该库信息做成个pc文件放到pkg-config目录,这样configure才能找到它。

    注意,这三者的功能有重合,所以必须保证他们不冲突,不然会出现pkg-config找到的库与系统环境变量LD_LIBRARY_PATH指定的库不一致的情况,如:

checking for GLIB - version >= 2.31.2...
*** 'pkg-config --modversion glib-2.0' returned 2.34.2, but GLIB (2.28.6)
*** was found! If pkg-config was correct, then it is best
*** to remove the old version of GLib. You may also be able to fix the error
*** by modifying your LD_LIBRARY_PATH enviroment variable, or by editing
*** /etc/ld.so.conf. Make sure you have run ldconfig if that is
*** required on your system.
*** If pkg-config was wrong, set the environment variable PKG_CONFIG_PATH
*** to point to the correct configuration files
-------------------------------------------------------------------------分割线------------------------------------------------------------------------------

网上看到这样一段话:

需要澄清一下:

l  ldconfig做的事情都与运行程序时有关,跟编译时一点关系都没有

l  需要注意的是LD_LIBRARY_PATH通常只是在程序运行时告诉loader该去哪查找共享库,比如gcc编译时的链接器可能就不会去查找LD_LIBRARY_PATH。

l  查找时如果找到了同名的动态库和静态库如何处理?当我们指定一个路径下的库文件名时,假如此时同时存在xxx.a和xxx.so的两个库形式,那么优先选择.so链接(共享库优先)。如果使用了-static,找到了.so是否会使用?如果使用了-Bdynamic,那找到了.a会不会使用?.a的生成能否依赖.so?它所依赖的这些.so能否不加入-l参数列表?

l  系统中链接器与加载器的区别?编译时的链接器是ld,加载器则位于ld-linux.so。加载器是否去/etc/ld.so.conf中目录下去寻找所需的.so,还是依赖于ldconfig去更新ld.so.cache文件,?答案是依赖于ldconfig去更新cache。

l  系统中的ld与gcc采用的链接器的区别?gcc –v查看gcc调用 as/ld 之类程序的时候传给它们的参数。通过gcc命令进行链接,与直接使用ld的区别?库查找路径是否不同?gcc的LIBRARY_PATH,应该是gcc本身用的环境变量。