将导出的符号保存在共享库中
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 不同。
【讨论】:
以上是关于将导出的符号保存在共享库中的主要内容,如果未能解决你的问题,请参考以下文章