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, 在生成动态库…………………