win平台/linux平台下C/C++库文件引入问题

来源:互联网 发布:软件开发工程师有多累 编辑:程序博客网 时间:2024/04/29 20:49
win平台:
win似乎不存在动态库这个东西。
就只有lib和dll。
lib和头文件用于编译:编译的时候需要告知lib文件目录,以及引入lib文件全称。如D:/xxx/0825slave/code/lib\lht_coreframework.lib(qt里面LIBS += lht_coreframework )
dll用于运行。默认运行的时候会去找系统PATH目录以及exe同级目录的同名dll,如lht_coreframework.dll。编译的时候没有dll是可以编译成功的,但运行的时候会出错。无论是编译库还是编译可执行程序都一样。


linux平台:
linux下动态库是.so文件
so文件和头文件用于编译。假如是编译库,没有so文件也可以编译成功(此时你ldd生成的so文件,根本查不到库缺失,非常难定位问题)。假如是可执行程序,编译最后链接的时会失败。
只有用正确的so文件和头文件编译才可能成功。编译的时候需要告知so文件目录,编译的时候动态库需要去头去尾,即libhiredis.so 要写作-lhiredis (qt里面LIBS += -lhiredis)
初步判断so文件中的函数内容,nm命令。
编译成功后,ldd可以查出链接状况,如:
 ldd libcom.lht.redis_0.9.0.so
     libhiredis.so.0.11 =>not found
     libQtCore.so.4 => /opt/qt4.8.6/lib/libQtCore.so.4 (0x00007f002d633000)
     ...
这又奇怪了,我明明编译成功,找到库了,怎么还是not found。
答案:
这里有2层错误
1. 库文件名称不对,我们编译的时候链接的是libhiredis.so,仅满足编译;但是链接的时候要求的是libhiredis.so.0.11, 于是我们需要给动态库起一个别名,即建立软链接ln -s  libhiredis.so  libhiredis.so.0.11
2. 环境变量LD_LIBRARY_PATH没设置到libhiredis.so.0.11的路径。或者不设置LD_LIBRARY_PATH,用ldconfig, 即在/etc/ld.so.conf.d/下新建一个任意文件,在其中写libhiredis.so.0.11的路径。保存后运行ldconfig即可。

上述操作结束后,在ldd就是这样的:
ldd libcom.lht.redis_0.9.0.so
     libhiredis.so.0.11 => /home/xxx/Documents/my_cloud_box/cloudboxback/bin/libhiredis.so.0.11 (0x00007f002db3e000)
     libQtCore.so.4 => /opt/qt4.8.6/lib/libQtCore.so.4 (0x00007f002d633000)
     ...

以下是linux下常用的检查动态库的命令:
1. 查看动态库依赖关系
ldd a.so

2. 查看动态库详情
objdump -p a.so

3. 查看动态库类型
file a.so

4. 查看动态库引入了哪些函数
nm a.so

5. 查看动态库引入了哪些函数(假如nm查不到,则以下命令)
nm -Do a.so
readelf --symbols  a.so


6. 查看动态库引用符号表
objdump -T a.so


7. 查看动态库引用符号表(objdump更好)
strings a.so 
0 0
原创粉丝点击