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)
...
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)
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
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
- win平台/linux平台下C/C++库文件引入问题
- linux 平台下C语言创建文件
- linux 平台下C语言创建文件
- ftp客户端库(C编写,平台Linux,Win)
- 【C/C++】Win平台下C语言定时器使用手记
- Win 7 下搭建eclipse c/c++ 开发平台
- linux平台下基于C语言实现遍历文件目录
- Linux下搭建c、c++开发平台
- linux平台下的C语言开发
- 文件压缩(平台Linux & 语言C++)
- linux平台C语言打开文件
- win平台C语言油槽通信
- win平台C语言共享内存通信
- win平台 C语言-进程管理
- WIN平台下Apache常用问题
- Windows平台下搭建Obcject-C平台
- 51平台下初始化文件的引入导致全局变量无法初始化的问题
- 最长平台问题 C实现
- 关于Cocos2d-x的一些认识(5)
- sleep和wait的区别
- 【C/C++学院】(12)C++标准模板库STL
- Cocos2d-x之getVisibleSize,getContentSize,boundingBox,getContentSizeInPixels,convertToGL,convertToUI
- You are given a tetrahedron.
- win平台/linux平台下C/C++库文件引入问题
- linux c/c++ 帮助
- log4j日志级别
- ---评微软数据结构+算法面试100题
- php使用pdo操作数据
- 最好用Unity粒子系统组件主要参数浅析
- 深入研究java.lang.Runtime类
- Firefox for iOS现身Github 使用Swift编写
- JS中onkeydown, onkeyup, onblur 三个事件对比 并js实现判断文本框是否为空和按Enter键实现Tab换行