我需要在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
是特定的目标
答案 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
行为,除非它被覆盖。