printme()和getme()
我在main函数
中的test.cpp(test cpp文件)中使用了printme()函数g++34 -c top.cpp -fPIC
ar rcs libtop.a top.o
g++34 -c test.cpp -fPIC
g++34 -shared -o ltop.so -ltop -L. -fPIC
getme未在ltop.so
中导出如何强制在ltop.so中导出getme函数
当我做nm ltop.so
它没有显示getme符号
我想强迫这个
注意:文件可以有多个未使用的函数,如 - getme()
我想强制所有人导出到所以库
答案 0 :(得分:2)
不要使用静态库来创建动态库。而是直接使用组件对象文件:
g++34 -shared -o ltop.so -fPIC top.o
原因是当您在编译二进制文件时指定带有-l
的库时,只会拾取编译行中较早的未解析的外部符号。在你的情况下,这没什么,所以从libtop.so
libtop.a
时没有任何内容
UPDATE:作为替代方案,如果原始目标文件不再可用,则使用--whole-archive
链接器选项强制它包含静态库中的所有内容,而不是只是未解决的外部因素:
g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive ./libtop.a
或者:
g++34 -shared -o ltop.so -fPIC -Wl,--whole-archive -L. -ltop
答案 1 :(得分:2)
通常,当链接到静态库时,只有静态库中包含未解析符号的模块最终会被链接。
这里,由于没有未解析的getme
()引用,因此该模块不会从静态库链接。解决方案是明确地解决它。
一个次要的复杂因素是C ++符号名称错误。有必要弄清楚getme()
函数的错位符号名称是什么。最简单的方法是使用nm
命令查看库:
$ nm libtop.a
top.o:
0000000000000000 T _Z5getmei
好的,因此受损的符号名称为_Z5getmei
。 -u
链接器标志强制对链接时使用的指示符号进行未解析的引用:
g++ -shared -o ltop.so -L. -ltop -Wl,-u -Wl,_Z5getmei
-u
手册的文档位于ld
手册页中。这包括共享库中的模块:
$ nm ltop.so | grep getme
0000000000000680 T _Z5getmei