实用方便解决error while loading shared libraries办法,及linux gcc 下使用总结

来源:互联网 发布:淘宝助理上传到仓库 编辑:程序博客网 时间:2024/05/17 13:45

linux gcc 下使用总结转自:点击打开链接

我们在linux下编译程序需要用到自己的动态库时,有时会碰到这个问题,error while loading shared libraries。

本质原因就是链接器在默认的lib库中找不到我们所需要的动态库,网上有很多解决办法,大部分都是说把你的动态库,拷贝到/usr/lib或者/lib下。

其实还有一个更方便实用的方法,就是在你的编译命令中,增加上

-Xlinker -rpath=./
如果你的动态库是在当前路径下的话。

如果您只是想解决这个问题,您可以不用往下面看了~

---------------------------------------------我是华丽的分割线----------------------------------------------------------------

入门知识

编译器把编译生成目标代码的任务分为以下4步:
a.预处理,把预处理命令扫描处理完毕;
b.编译,把预处理后的结果编译成汇编或者目标模块;
c.汇编,把编译出来的结果汇编成具体CPU上的目标代码模块;
d.连接,把多个目标代码模块连接生成一个大的目标模块;

gcc 下常用参数

-I 指定头文件搜索路径,默认情况下gcc的搜索路径/usr/include /usr/local/include
-L 指定库文件的搜索路径,默认的搜索路径为 /lib/ /usr/lib /usr/local/lib ??
-l 指定需要链接的库名称, 注:正常的库libboost_regex.so 使用-lboost_regex 省略前面的lib和后面的扩展名
-c 只生成目标代码 注:生成库文件时使用,只编译不链接
-shared 生成动态库
-o 指定输出文件名称
-W 显示所有的警告信息 注:建议打开
-w 屏蔽所有的警告信息,默认情况
-g 把调试开关打开,让编译的目标文件有调试信息
-S 把源文件编译成汇编代码,不做汇编和连接的动作
-E 只把源文件进行预处理之后的结果输出来。不做编译,汇编,连接的动作

-Xlinker -rpath=./lib 指定程序运行是动态库的搜索路径

-MM 显示出目标文件所依赖的源文件和头文件,头文件仅包括本地头文件

-M    与-MM类似,但是头文件包括系统头文件,即用”<>”

这两个参数在写makefile时用到

实用方法

1, 生成动态库方法
$ gcc -fPIC -c func.c -o func.o
$ gcc -shared -o libfunc.so.1.0.0 func.o
2, 生成静态库方法
$ gcc -c func.c -o func.o
$ ar rcs libfunc.a func.o
3, ldd 命令
查看动态库和可执行文件的依赖的库

4. -MM参数

[yaronli@sim124 cc]$ gcc -MM transfer/Transfer_server.cpp -I. Transfer_server.o: transfer/Transfer_server.cpp transfer/Transfer.h \  transfer/transfer_types.h transfer/TransferStatus.h \  transfer/TransferTasks.h common/TaskIf.h transfer/TransferWorker.h \  common/RingBuffer.h common/TaskIf.h common/FileHandler.h common/log.h \  common/DbOperator.h transfer/Transfer_server.h

问题总结

1, 静态编译时,被依赖库放到依赖库的后面,否则链接时会出错
2, 在生成动态库…………………

原创粉丝点击