2025年5月13日,周二清晨
#ifdef WINDOWS
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
为啥Linux和MacOS平台时宏为空,难道Linux和mac不用定义导出函数吗?
这段代码是一个跨平台的宏定义,用于处理不同操作系统下动态库(DLL/SO)中函数的导出声明。具体解析如下:
-
Windows平台(
WINDOWS
宏定义生效时):
• 使用__declspec(dllexport)
显式标记需要导出的函数/类,这是Windows特有的语法。• 例如:
DLL_EXPORT void foo()
会被展开为__declspec(dllexport) void foo()
。 -
Linux/macOS平台(
WINDOWS
未定义时):
•DLL_EXPORT
被定义为空,因为:◦ Linux/macOS的共享库(.so/.dylib)默认导出所有符号(除非显式隐藏)。
◦ 若需精细控制导出,可使用
__attribute__((visibility("default")))
,但这不是强制要求的。
为什么Linux/macOS不需要强制导出?
• 设计差异:Windows的DLL需要显式声明导出/导入(通过.lib
导入库),而Unix-like系统默认全局可见符号。
• 扩展语法:Linux/macOS通过编译选项(如-fvisibility=hidden
)和属性控制可见性,而非关键字。