为什么MSVC(Visual C++)需要单独的dllimport和dllexport属性,而gcc不需要?

xriantvc  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(174)

我知道为什么以及何时在Visual C中使用__declspec(dllimport)__declspec(dllexport)
我知道__declspec(dllimport)__declspec(dllexport)的GCC替代品是__attribute__((visibility("default")))
我只是想知道为什么Visual C
需要这两个命令,而GCC能够自己判断是否应该导入或导出符号?
GCC方法是否有一些缺点,例如导出(模板化/内联)本应导入的函数?

  • 当然,简单的答案是:“这是GNU/Microsoft的设计选择”,也许这是唯一的答案。谢谢您的输入!*
zf2sa74q

zf2sa74q1#

我没有足够的知识来详细说明gcc的内部结构,但是您可以亲自体验一下,注意到在使用-fvisibility=hidden编译时,gcc/llvm将导出共享库文本部分中的符号(nm -gD命令输出中的T类型符号),仅适用于visibility("default")已恢复且方法/类型已在库边界内正确定义的情况。此类图书馆的用户(如其他共享库)将不会重新导出文本部分中的符号,即使它们使用默认可见性进行了修饰,但只会将其用作未定义的符号(nm输出中的U类型符号)gcc/llvm清楚地具有链接时的信息以确定必须写入哪个表来区分,使用MSVC术语,exportimport 用法。如果使用不一致的链接访问符号,观察一些特性(如RTTI)可能无法正常工作也很重要,因此最好在库头中始终显示默认的可见性属性。

相关问题