在top.cpp和top.h中定义的printme()和getme()
我在主要功能的test.cpp(测试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()
我想强制所有人将其导出到,以便库
最佳答案
通常,与静态库链接时,仅静态库中包含未解析符号的模块最终会被链接。
在这里,由于没有未解决的对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