在top.cpp和top.h中定义的printme()和getme()

我在主要功能的te​​st.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

09-10 19:39