Windows和Linux上的C ++ [[gnu :: visibility(“default”)]] vs __declspec(dllexport)

时间:2014-01-24 14:59:55

标签: c++ attributes visibility declspec

我需要在C ++中创建一些共享库,我使用linux作为开发人员操作系统。我知道如果我想通过dlsym / LoadLibrary加载符号,我需要显示符号。所以在linux中我的所有符号都遵循这种模式:

extern "C" [[gnu::visibility("default")]] void f();

我在启用C ++ 11时使用了clang,我可以在宿主程序中加载f。当我移动到Windows时,我使用了GCC 4.8.2并启用了C ++ 11,并且该模式也适用于LoadLibrary的Windows机器。 (我需要使用C ++ 11来获取新的属性语法)。我知道在Windows上我需要使用__declspec(dllexport)从共享库中导出符号。所以现在怎么办?是否__declspec(dllexport)不再需要了?

编辑:

我发现here这些是同义词(我认为)所以问题是[[gnu::attribute]]__declspec(dllimport)以避免使用宏而ifdef是特定的目标

1 个答案:

答案 0 :(得分:5)

符号可见性与dllexport略有不同 - 主要原因是当您在.dll / mingw下的Windows中编译cygwin时,默认{{3选项-export-all-symbols - 即默认情况下它会自动导出所有。{/ p>

您可以使用.dll文件或在{em>任何例程上放置.def__declspec((dllexport))来更改此行为(即,如果您指定单个例程要导出符号,然后仅导出声明导出的符号)。如果库中存在大量符号,则在dll加载时可以显着提高性能。

如果您想使用等效的__attribute((dllexport))属性,请使用C++

是的,请使用[[gnu::dllexport]]让您的dllexport不要出口这个世界。

以类似的方式,您可以使用.dll导入外部例程。

阅读文档时要小心;它实际上说的是,当您使用[[gnu:dllimport]]属性时,它还会触发dllexport行为,除非它被覆盖。