开发者社区> 问答> 正文

linux g++ 代码编译 链接 库 ?报错

我的一个工程使用 到了 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 放到默认搜素路径下吗? 不会搜素我的当前目录么?


--------

谢谢;

展开
收起
爱吃鱼的程序员 2020-06-14 17:00:22 788 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    估计是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加的的,否则就不会编译通过。只是运行报错。问题应该在于链接静态库动态库的区别上。
    2020-06-14 17:00:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载