我需要在C++中创建一些共享库,并将linux作为我的开发操作系统。我知道如果想要通过dlsym
/LoadLibrary
加载它们,我需要使符号可见。因此,在linux中,我的所有符号都遵循这个模式:
extern "C" [[gnu::visibility("default")]] void f();
我使用启用了C++11的clang,并且能够在我的主机程序中加载
f
。当我转向Windows时,我使用启用了C++11的GCC 4.8.2,在Windows机器上也使用了LoadLibrary
来使该模式运行。(我需要使用C++11进行新属性语法)。我知道在Windows上我需要使用__declspec(dllexport)
来从共享库中导出符号。那么现在呢?__declspec(dllexport)
不再需要吗?编辑:
我在这里找到here,它们是同义词(我想),所以问题是是否有一个
[[gnu::attribute]]
用于__declspec(dllimport)
,以避免为特定目标使用宏和ifdef
?
[[gnu::dllexport]]
仅适用于GCC,是吗?是否有类似的东西在Clang和MSVC下也能工作? - Andrii Zymohliad__declspec((dllexport|dllimport))
,所以您可以使用它,但这不是“干净”的C ++。如果您想要保证平台兼容的代码,只能依靠标准指定的[[ ]]
属性。 - Anya Shenanigans