c++ - 强制未使用的函数在共享库中导出

标签 c++ gcc

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/

相关文章:

c++ - 如何使用C++递归以面向对象形式(OOP)打印链接列表

c++ - 如何连接 LPCWSTR?

c - 选择c编译器并创建开发环境

c - 我在 SPOJ、语言 C、编译器 gcc 4.3.2 中收到以下代码的运行时错误:代码为 :

c++ - 是否可以关闭 gcc 的自动并行化?

c++ - memset() 在 C++ 中的工作原理

c++ - v8 c++ - 如何获取作为参数提供的对象键值

C++ 模板类对于不同的编译器表现不同

macos - 如何修复 "No manual entry for gcc"?

assembly - grub 似乎没有正确加载我的内核