我的一个工程使用 到了 libjpeg 库, 和sqlite3 库;
在最后编译成可执行文件的时候, 使用的是 libjpeg.so 。
虽然编译成功了,但是在运行程序的时候 报错, 提示找不到 libjpeg.so.9
后来只有 被迫使用 静态库 链接;
有谁能解释一下 为什么 会有这个报错?
--------
感谢各位的回答;受益匪浅;
静态连接库就是把(lib)文件中用到的函数代码直接链接进目标程序,程序运行的时候不再需要其它的库文件;动态链接就是把调用的函数所在文件模块(DLL)和调用函数在文件中的位置等信息链接进目标程序,程序运行的时候再从DLL中寻找相应函数代码,因此需要相应DLL文件的支持
这个库 的确不在我的/usr/lib 下, 我是将所有的 需要的文件都拷贝到当前目录下编译的; 编译命令:g++ -std=c++11 *.o -o text -L. -ljpeg -lsqlite3
疑问: 我使用的 -L. 命令, 即使这样我还是要把 libjpeg.so 放到默认搜素路径下吗? 不会搜素我的当前目录么?
--------
谢谢;
估计是libjpeg.so这个动态库不在系统默认的搜索路径中
ldd看下你的程序就知道了 我猜是notfound的情况
ldconfig-p|grepjpeg 估计也没有
可以将libjpeg.so放到默认的搜索路径中去
回复 @Carlyle_Lee:搜索路径默认是/lib/usr/lib(/usr/lib64),/etc/ld.so.conf,还有环境变量LD_LIBRARY_PATH可以进行指定回复 @Carlyle_Lee:编译的时候,从动态库中拿到相应的符号(也就是导出的函数),并标记为动态加载,真正运行的时候再再进行动态加载,所以编译的时候要用到动态库,运行的时候也要用到,而使用静态库的时候,在编译连接的时候,静态库中的内容已经被全部包含进程序中了。推荐看看《程序员的自我修养-链接,装载与库》里面讲得很详细对的;这个库的确不在我的/usr/lib下,我是将所有的需要的文件都拷贝到当前目录下编译的;编译命令:g++-std=c++11*.o-otext-L.-ljpeg-lsqlite3疑问:我使用的-L.命令,即使这样我还是要吧libjpeg.so放到默认搜素路径下吗?不会搜素我的当前目录么?设置LD_LIBRARY_PATH环境变量,运行时加载动态库时通过这个环境变量的设置的目录去查找的这个取决你在编译的时候so的链接路径是直接写死的还是使用lib搜索路径的参数编译1.加libjpeg.so的路径加入到/etc/ld.so.conf文件
2.执行ldconfig
3.执行ldconfig-p|greplibjpeg确认是否添加成功。
这个方法适合你本机开发调试。
如果是客户使用,直接使用yuminstalllibjpeg安装这个库,即可执行运行你程序了。
使用makeinstall把libjpeg的动态库放到/usr/lib里面链接时需要指定用到的库,了解一下g++的-l参数。你试下在链接时加-ljpeg加的的,否则就不会编译通过。只是运行报错。问题应该在于链接静态库动态库的区别上。版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。