使用.def或__declspec(dllexport)导出跨平台代码的共享库符号

Use .def or __declspec(dllexport) to export shared library symbols for cross-platform code?

本文关键字:代码 跨平台 共享 符号 def declspec 使用 dllexport      更新时间:2023-10-16

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

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

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

如果你和我一样是这个主题的新手(跨平台,从托管代码中使用非托管C++),你可以在这里看到我所做的示例(请参阅问题部分):尽管链接到带有导出符号的.lib文件,但从托管C++链接到非托管C++时发生链接错误