将导出的符号保存在共享库中

Posted

技术标签:

【中文标题】将导出的符号保存在共享库中【英文标题】:Keep exported symbol in shared library 【发布时间】:2014-06-16 15:25:30 【问题描述】:

我一定遗漏了一些微不足道的东西。我想声明一个用于导出的类——只是模块中的一个。它不在同一个库中的任何地方使用,因此链接器将其剥离。提供所有 hidden 可见性和导出的 default 无助于哄骗链接器。

如果我告诉链接器--whole-archive,它会抱怨完全不相关函数的多个定义。此外,我不想导出所有内容——只导出一个类。

#pragma GCC visibility push(default)
class C  public: C()   ;
#pragma GCC visiblity pop

// with this line the class is exported
// without it — it does not
delete new C();
// the line does nothing useful,
// just references the constructor

【问题讨论】:

不是 Linux 专家。但是从我参与的项目中,我知道您可以像使用 Windows DLL 一样使用共享库。语法有点不同,但以相同的导出宏结束。 Here你可以阅读它。 是的,在带有 Visual C++ 的 Windows 中,我可以简单地指定 __dllexport 简而言之:用-fvisibility=hidden编译然后自己构建导出宏,如我在第一条评论中链接的页面底部所示。 我在问题中提到它没有帮助。 我认为从 gnu 编译器 4.0 向上工作的所有内容。也许你犯了一些小错误——比如忘记了 -shared 链接器选项或类似的? 【参考方案1】:

事实证明,虽然可以指示 CUDA 的 nvcc 编译器使用 gcc 进行编译,但它仍然自己进行链接。而且它的做法与 gcc 不同。

【讨论】:

以上是关于将导出的符号保存在共享库中的主要内容,如果未能解决你的问题,请参考以下文章

关于 Linux 中的共享库,有没有办法在库中选择导出函数?

是否可以防止 C 共享库中的函数覆盖?

从 .SO ( linux ) 导出 C++ 类

如何将 #defines 从 C++ 共享库导出到应用程序

当另一个库具有相同的符号时,gdb 不显示来自共享库的符号

有没有办法确定共享库导出符号的函数参数?