top.cpp 和 top.h 中定义的 printme() 和 getme()
我在main函数的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()
我想强制全部导出到so库
最佳答案
通常,当与静态库链接时,只有静态库中包含未解析符号的模块才会被链接。
这里,因为没有未解析的getme
() 引用,所以这个模块没有从静态库中获取链接。解决方案是明确地使其成为 Unresolved 。
一个次要的复杂因素是 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
关于c++ - 强制未使用的函数在共享库中导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38348490/