__declspec(dllexport)、__declspec(dllimport)、attribute((visibility(“default”)))。这三个修饰符用于控制符号的导出和可见性,适用于不同的平台和编译器。以下是对每个修饰符的详细说明:
1. __declspec(dllexport)
- 用途:用于在 Windows 平台上声明一个符号(例如函数、类或变量)是从 DLL 导出的。
- 语法:在函数或变量的声明前加上
__declspec(dllexport)。 - 示例:
__declspec(dllexport) void myFunction(); - 作用:当你编译一个 DLL 时,使用
__declspec(dllexport)可以告诉编译器将该符号导出到 DLL,使得其他程序可以链接并调用该符号。 - 对应的导入:当一个程序使用 DLL 中的符号时,它需要使用
__declspec(dllimport)来告诉编译器从 DLL 中导入符号。
2. __declspec(dllimport)
- 用途:用于在 Windows 平台上声明一个符号是从 DLL 导入的。
- 语法:在函数或变量的声明前加上
__declspec(dllimport)。 - 示例:
__declspec(dllimport) void myFunction(); - 作用:当你在程序中使用 DLL 中的符号时,使用
__declspec(dllimport)来告诉编译器该符号来自于一个 DLL。 - 与
dllexport的关系:通常在同一个代码文件中,使用__declspec(dllexport)和__declspec(dllimport)来根据编译条件控制符号的导出或导入(通常是通过预处理宏来实现)。
3. __attribute__((visibility("default")))
- 用途:用于在 Linux 和其他 POSIX 系统中声明一个符号是可见的,控制符号的可见性。
- 语法:在函数或变量的声明前加上
__attribute__((visibility("default")))。 - 示例:
void myFunction() __attribute__((visibility("default"))); - 作用:
__attribute__((visibility("default")))告诉编译器在创建共享库(如.so文件)时将该符号导出,使得其他程序可以链接并调用该符号。 - 可见性选项:
default:符号对所有目标可见(类似于__declspec(dllexport))。hidden:符号对其他目标不可见,仅在当前库内部可见。protected:符号可被继承,但不被其他目标直接访问。
总结
这三个修饰符的主要作用是控制符号的导出和可见性,分别用于不同的平台:
__declspec(dllexport)和__declspec(dllimport)是 Windows 特有的,用于 DLL 的导出和导入。__attribute__((visibility("default")))是 GNU 编译器(GCC)特有的,适用于 Linux 和 POSIX 系统,提供更灵活的符号可见性控制。
使用这些修饰符,可以有效地管理共享库中的符号,并确保在不同的编译环境中正确地导出和导入符号。

2742

被折叠的 条评论
为什么被折叠?



