Sző*_*lcs 8 c++ attributes visibility declspec
我需要在C++中创建一些共享库,并使用linux作为我的开发人员操作系统.我知道如果我想通过dlsym/ 加载它们,我需要使符号可见LoadLibrary.所以在linux中我的所有符号都遵循这种模式:
extern "C" [[gnu::visibility("default")]] void f();
Run Code Online (Sandbox Code Playgroud)
我使用了启用了C++ 11的clang,我能够加载f我的宿主程序.当我移动到Windows时,我使用GCC 4.8.2启用了C++ 11,并且该模式也适用于Windows机器LoadLibrary.(我需要使用C++ 11来获取新的属性语法).我知道在Windows上我需要用来__declspec(dllexport)从共享库中导出符号.所以现在怎么办?是__declspec(dllexport)不是不再需要?
编辑:
我发现在这里,那些是同义词(我认为),所以问题是,是否有一个[[gnu::attribute]]用于__declspec(dllimport)避免使用宏和ifdefS代表具体的目标?
符号可见是微妙的不同dllexport-而最主要的原因是,当你编译一个.dll在Windows下mingw/ cygwin,默认链接器的行为是选项-export-all-symbols-也就是说,它会自动导出一切从你的.dll默认。
您可以通过使用.def文件或将一个__declspec((dllexport))或任何例程__attribute((dllexport))放在任何例程上来更改此行为(即,如果指定要导出单个符号,则仅导出声明为已导出的符号)。如果您的库中有很多符号,则可以在dll加载时显着提高性能。
如果要使用等效C++属性,则使用[[gnu::dllexport]]
因此,可以使用,dllexport以防止您.dll向世界出口。
您可以用类似的方式[[gnu:dllimport]]来导入外部例程。
阅读文档时要小心;它的实际含义是,当您使用该dllexport属性时,visibility:default除非覆盖了该属性,否则还会触发该行为。