【问题标题】: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 链接器选项或类似的?

标签: c++ linux linker shared-libraries


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2012-03-27
    • 2014-04-01
    • 1970-01-01
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多