linux g++ 代码编译 链接 库

Carlyle_Lee 发布于 2015/04/01 23:34
阅读 746
收藏 0
GCC

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


--------

谢谢;

加载中
1
hncscwc
hncscwc

估计是 libjpeg.so 这个动态库不在系统默认的 搜索路径中

ldd 看下你的程序就知道了  我猜是 not found的情况

ldconfig -p | grep jpeg     估计也没有

可以将libjpeg.so放到默认的搜索路径中去

hncscwc
hncscwc
回复 @Carlyle_Lee : 搜索路径默认是/lib /usr/lib(/usr/lib64),/etc/ld.so.conf , 还有环境变量LD_LIBRARY_PATH可以进行指定
hncscwc
hncscwc
回复 @Carlyle_Lee : 编译的时候,从动态库中拿到相应的符号(也就是导出的函数),并标记为动态加载,真正运行的时候再再进行动态加载,所以编译的时候要用到动态库,运行的时候也要用到,而使用静态库的时候,在编译连接的时候,静态库中的内容已经被全部包含进程序中了。推荐看看《程序员的自我修养-链接,装载与库》里面讲得很详细
Carlyle_Lee
Carlyle_Lee
对的;这个库 的确不在我的/usr/lib 下, 我是将所有的 需要的文件都拷贝到当前目录下编译的; 编译命令:g++ -std=c++11 *.o -o text -L. -ljpeg -lsqlite3 疑问: 我使用的 -L. 命令, 即使这样我还是要吧 libjpeg.so 放到默认搜素路径下吗? 不会搜素我的当前目录么?
0
Ivnoidea
Ivnoidea
设置LD_LIBRARY_PATH环境变量,运行时加载动态库时通过这个环境变量的设置的目录去查找的
0
NDSM
NDSM
这个取决你在编译的时候so的链接路径是直接写死的还是使用lib搜索路径的参数编译
0
淡定的wo
淡定的wo

1. 加libjpeg.so的路径加入到 /etc/ld.so.conf 文件

2. 执行ldconfig

3. 执行 ldconfig -p|grep libjpeg 确认是否添加成功。


这个方法适合你本机开发调试。

如果是客户使用,直接使用 yum install libjpeg 安装这个库,即可执行运行你程序了。

0
Micooz
Micooz
使用make install把libjpeg的动态库放到/usr/lib里面
-1
changnet
changnet
链接时需要指定用到的库,了解一下g++的-l参数。你试下在链接时加-ljpeg
Carlyle_Lee
Carlyle_Lee
加的的,否则就不会编译通过。只是运行报错。问题应该在于链接静态库动态库的区别上。
返回顶部
顶部