我知道为什么以及何时在Visual C中使用__declspec(dllimport)
和__declspec(dllexport)
。
我知道__declspec(dllimport)
和__declspec(dllexport)
的GCC替代品是__attribute__((visibility("default")))
。
我只是想知道为什么Visual C需要这两个命令,而GCC能够自己判断是否应该导入或导出符号?
GCC方法是否有一些缺点,例如导出(模板化/内联)本应导入的函数?
- 当然,简单的答案是:“这是GNU/Microsoft的设计选择”,也许这是唯一的答案。谢谢您的输入!*
1条答案
按热度按时间zf2sa74q1#
我没有足够的知识来详细说明gcc的内部结构,但是您可以亲自体验一下,注意到在使用
-fvisibility=hidden
编译时,gcc/llvm将导出共享库文本部分中的符号(nm -gD
命令输出中的T
类型符号),仅适用于visibility("default")
已恢复且方法/类型已在库边界内正确定义的情况。此类图书馆的用户(如其他共享库)将不会重新导出文本部分中的符号,即使它们使用默认可见性进行了修饰,但只会将其用作未定义的符号(nm
输出中的U
类型符号)gcc/llvm清楚地具有链接时的信息以确定必须写入哪个表来区分,使用MSVC术语,export 和 import 用法。如果使用不一致的链接访问符号,观察一些特性(如RTTI)可能无法正常工作也很重要,因此最好在库头中始终显示默认的可见性属性。