【问题标题】:Use .def or __declspec(dllexport) to export shared library symbols for cross-platform code?使用 .def 或 __declspec(dllexport) 导出跨平台代码的共享库符号?
【发布时间】:2012-07-16 15:29:17
【问题描述】:

如何在确保代码跨平台的同时正确导出共享库符号(用于从 Visual Studio 中的客户端代码链接)?具体来说是使用 .def 推荐的方式还是应该为 __declspec(dllexport) 使用特定于平台的宏?如果应该使用宏,你能举一个跨平台友好的例子吗?

我有一些用于跨平台使用的本机 C++ 代码,并使用 Cmake 生成 .sln/.vcxproj 文件,该文件创建 .dll 文件以在 Windows 中使用。要从 C++/CLI 包装器(也是一个 dll)链接到这个 dll,我需要有 .lib,它需要导出符号。我了解到我需要使用 __declspec(dllexport) 或 .def 文件。我担心的是我不想用 MSVC 的东西来调整共享代码(我们需要支持 Linux、iOS、Mac OSX、Android ......)。

【问题讨论】:

  • 您已经回答了这个问题。您可以使用 .def 文件来定义导出(不影响源代码),或者如果这不重要,您可以向源添加注释。你的选择!
  • 我不确定 .def 在这种情况下是否是正确的方法。我可以导出功能。对于导出类,我需要使用有问题的重命名:stackoverflow.com/questions/186232/…
  • @SethCarnegie 谢谢!该链接确实让我对这个符号导出/导入主题有了更多想法。

标签: c++ visual-studio-2010 cross-platform cmake


【解决方案1】:

SethCarnegie 的链接 gcc.gnu.org/wiki/Visibility 可能是对这个问题的间接回答。简而言之,我决定使用宏(预处理器符号),这似乎可以很好地用于跨平台并进行一些规划。虽然 .def 与代码分开,但没有相应的导入方式,即我仍然需要使用 __declspec(dllimport) -- 不是很干净的 IMO。

如果您像我一样不熟悉此主题(跨平台,使用托管代码中的非托管 C++),您可以在此处查看我所做的示例(请参阅问题部分): Link error linking from managed to unmanaged C++ despite linking to .lib file with exported symbols

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2016-03-25
    • 1970-01-01
    • 2015-04-11
    • 2018-08-05
    相关资源
    最近更新 更多