当前位置: 技术问答>linux和unix
gcc动态链接库的问题
来源: 互联网 发布时间:2016-07-10
本文导语: 我想写一个动态链接库, 有2个要求: 1,所有调用到gcc动态库部分的,都要静态编译进来, 因为目标系统上没有这些动态库,比如libstdc++.so等 感觉特想windows上把MFC静态还是动态编译进来一样-..- 2,导出其中的2个函数(传...
我想写一个动态链接库,
有2个要求:
1,所有调用到gcc动态库部分的,都要静态编译进来,
因为目标系统上没有这些动态库,比如libstdc++.so等
感觉特想windows上把MFC静态还是动态编译进来一样-..-
2,导出其中的2个函数(传闻linux下面动态库默认导出所有符号)
比如代码是 ,要生成
谢谢各位大侠鼎力相助~
有2个要求:
1,所有调用到gcc动态库部分的,都要静态编译进来,
因为目标系统上没有这些动态库,比如libstdc++.so等
感觉特想windows上把MFC静态还是动态编译进来一样-..-
2,导出其中的2个函数(传闻linux下面动态库默认导出所有符号)
比如代码是 ,要生成
谢谢各位大侠鼎力相助~
|
g++ -fpic -Wl,-shared -Wl,-static -lstdc++ -static-libgcc -o libX.so tlib.o
|
这个是当然的, gcc/g++ 的-shared 和 -static参数本来就是传给ld的。
俺要说的是,-shared和-static没有直接冲突,但是在某些平台上,由于-fpic/-fPIC参数的原因,
-shared和-static实际上可能是冲突的(比如FreeBSD 7.2 amd64)。
所以ld会报类似下面的错误
/usr/bin/ld: /usr/lib/crt1.o: relocation R_X86_64_32 can not be used when making a shared object; recompile with -fPIC
俺当然也清楚,如果在编译静态库的时候也用了-fPIC参数,或者说由于硬件体系的指令本来就是PIC的,也是能链接成功的(比如在我使用的fedora上 2.6.27.10 内核)
|
2,导出其中的2个函数(传闻linux下面动态库默认导出所有符号)
http://blog.pfan.cn/miaowei/45071.html
http://blog.pfan.cn/miaowei/45071.html
|
1
参看
http://www.blogjava.net/davidgw/archive/2009/01/21/252230.html
参看
http://www.blogjava.net/davidgw/archive/2009/01/21/252230.html
|
gcc -static
-static
On systems that support dynamic linking, this prevents linking with
the shared libraries. On other systems, this option has no effect.
-static
On systems that support dynamic linking, this prevents linking with
the shared libraries. On other systems, this option has no effect.
|
-shared 指定的是输出文件的格式,-static指定的是输入库的格式。
所以-shared和-static没有直接冲突
但是,在某些平台上-shared需要所有的.o是用-fpic或者-fPIC编译
不能保证所有的.a文件里的.o都用-fpic/-fPIC编译