要学会用man,特别是man2(系统调用)和man3(C函数库),比如:
mansqrt
会显示需要引用的头文件,专编译时需要的动态链接库
如果属重复,则需要指定手册章节,比如
manwrite显示的是write程序帮助,如果想看系统调用,则要输入man2wirte
另外,/lib64:/lib:/usr/lib64:/usr/lib这些是系统缺省的,不用指定
Ⅱ 面试 | Linux 下的动态链接库问题
在 Linux 开发时,我们经常会看到一些形如 xxx.so 的名称出现,其中 so 是 Shared Object 的缩写,即可以共享的目标文件,也就是我们所称为的动态链接库,和在 Windows 下大家玩 游戏 时遇到的 xxx.dll 错误中的文件是一个类型的。
面试中经常会问到以下问题:
库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。
库有两种:
在一个程序的编译过程中,分为以下几个步骤: 预处理 , 编译 , 汇编 , 链接 。本文中讨论的链接库就是针对最后一个步骤「链接」而言的。
动态库和静态库的区别
左图为静态链接库,右图为动态链接库
对于静态链接库而言在链接阶段,会将汇编生成的「目标文件.o」与引用到的库一起链接打包到可执行文件中。因此对应的链接方式称为静态链接:
静态链接可以理解为最后生成了一个「单文件免安装绿色版」的程序,优点在于移植的时候只需要移动这一个文件,缺点在于文件体积非常大,为了解决这样的问题,就有了动态链接库。动态链接库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
动态库连接到系统空间,如果多个程序连接了同一个库,那么只需要一份,优点在于编译程序的时候不会将对应的库文件全部打包在生成的程序中,而是保留了到对应库的链接,缺点就是移植的时候如果只移动了对应的程序没有安装相关的库的话,就会看到类似以下喜闻乐见的结果了。
在 Linux 下一个动态库有y三个不同名字的文件组成:
当程序在内部列出所需要的链接库时,仅仅使用 soname。当你创建一个链接库时,使用 real name。安装一个新的链接库时,把它复制到一个DLL文件夹里,然后运行程序 ldconfig。ldconfig 检查存在的 real name 文件,并且创建指向它符号链接 soname 文件。可能大家比较常见到的有 libsodium 等。
有了上面关于库的一些基础知识之后,我们可以开始尝试创建一个动态库来供程序使用了。
比如我们有一个求最大值的函数 max(int a,int b,int c) ,放在文件 max.c 中文件内容如下:
可以通过:
将其编译为共享库,-fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; -shared是链接选项,告诉 gcc 生成动态库而不是可执行文件。为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件,比如可以写一个 max.h :
设置一个驱动函数来测试我们编写的动态库:
通过 gcc test.c -L. -lmax来生成 a.out,其中-lmax表示要链接 libmax.so,-L.表示搜索要链接的库文件时包含当前路径。
但是这样直接运行的话,会出现一个错误:
由于 Linux 是通过/etc/ld.so.cache文件搜寻要链接的动态库的,而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的,本次使用的动态库 libmax.so 并不在对应的目录下,就会导致程序无法找到对应的动态链接库,这样我们的解决方法有二:
小结
动态链接库是各个系统中的一个重要的组成部分且在 Linux 开发相关领域中尤为重要,也是一个面试的高频考点,除了动态链接库以外,还有以下相关知识也是高频考点,在面试前一定要准备好:
本文作者:Nova Kwok
Ⅲ linux的动态库.so文件放下哪里
这个一般没有要求。一般/lib /usr/lib
其它的要看具体情况。。。
如果你是自己编译的应用程序,.so文件一般就在安装目录下的lib目录中。
Ⅳ 用arm-linux交叉编译器使用动态库时搜索标准路径是什么
/usr/lib , /橘源usr/libxx xx为数字,一般32或64,x32
标准头好伍毕文友芹件搜索路径:/usr/include/
Ⅳ (linux)动态链接库找不到路径
ld.so.conf只是在编译时查找动态库的路径;
运行时动态库的查找路径默认在/usr/lib和/lib,所以找不到
可以设置LD_LIBRARY_PATH=/usr/local/ma(你动态库的所在目录)
或者把动态库拷贝到/usr/lib或/lib下
Ⅵ 如何让linux加载当前目录的动态库
linux 加载当前目录的动态库的方法是:设置合适的环境变量LD_LIBRARY_PATH。x0dx0a设置方法有以下三种:x0dx0ax0dx0a1、临时修改,log out之后就失效x0dx0a在terminal中执行:export LD_LIBRARY_PATH=./x0dx0ax0dx0a2、让当前帐号以后都优先加载当前目录的动态库x0dx0a修改~/.bash_profile在文件末尾加上两尘或歼行:派冲 LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH x0dx0ax0dx0a3、让所有帐号从此都团粗优先加载当前目录的动态库x0dx0a修改/etc/profile在文件末尾加上两行: LD_LIBRARY_PATH=./ 和 export LD_LIBRARY_PATH
Ⅶ Linux系统的库文件一般放在( )目录下
D
Linux的库一般在/lib或/usr/lib目录下。lib是库(Library)的英文缩写,它主要存放系统的链接库专文件,没有该目录则系统就无属法正常运行。/lib目录中存储着程序运行时使用的共享库。通过共享库,许多程序可以重复使用相同的代码,并且这些库可以存储在一个公共的位置上,因此能减小运行程序的大小。这个目录包含程序在链接时使用的各种库。
Ⅷ linux 编译是怎么添加动态库的路径
最简单配置就是把连接库目录,添加到/etc/ld.so.conf中,一行一个目激或录就行,添加激铅租完成后,执行#ldconfig更新动明兆态连接库。
Ⅸ linux怎么配置库目录附加依赖项
一、添加附加包含目录
法1:-I path(path为头文件路径)
启模脊 法2:将头文件拷贝到 /usr/local/码明include中
相当于VS中添加包含路径。
二、添加依赖库
法1,编译阶段,g++编译器编译:
-L path –lcaffe(path为附加库目录路径;-l指定附加依赖项,比如-lcaffe表示附加libcaffe.so动悄渗态库文件)。
执行阶段,在工作目录或环境变量中搜索dll文件:
添加环境变量:
2.1 /etc/ld.so.conf 文件中方法:
添加库目录,使其成为共享库:
2.1.1、 打开文件:sudo gedit /etc/ld.so.conf
2.1.2、在文件中添加路径(如libnnpack.so的路径)
2.1.2、使其生效:sudo ldconfig
2.2 export方法,参考:http://blog.csdn.net/xzzppp/article/details/53305120
VS中添加附加库目录路径和附加依赖项,分别如下图所示:
法2,在编译阶段直接指定: path/libcaffe.so(path为附加库目录路径,libcaffe.so为动态库,在执行阶段可以直接运行)
法3,, Linux动态库的默认搜索路径是/lib和/usr/lib,将动态库拷贝到这两个文件夹下面。