gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:17:19 25 4
gpt4 key购买 nike

我知道为什么以及何时在 Visual C++ 中使用 __declspec(dllimport)__declspec(dllexport)

我知道 GCC 替代 __declspec(dllimport)__declspec(dllexport)__attribute__((visibility("default"))).

我只是想知道为什么 Visual C++ 确实需要这两个命令,而 GCC 能够自行确定是应该导入还是导出符号?

GCC 方法是否有一些缺点,f.ex。通过导出(模板化/内联)本应导入的函数?

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

最佳答案

我没有足够的知识来详细说明 gcc 的内部结构,但你可以自己做实验,注意到 gcc/llvm 在使用 -fvisibility=hidden 编译时,将在共享中导出符号库文本部分(T nm -gD 命令输出中的类型符号)仅适用于 visibility("default") 已恢复且方法/类型已正确定义的部分在库边界内。此类库(例如其他共享库)的用户不会重新导出文本部分中的那些,即使它们被装饰为默认可见性,而只是将其作为 undefined symbol (U 类型)使用nm 输出中的符号)。 gcc/llvm 显然在链接时有信息来确定符号必须写入哪个表,区分(使用 MSVC 术语)exportimport 用法。同样重要的是要注意,如果使用不一致的链接访问符号,某些功能(例如 RTTI)可能无法正常工作,因此最好始终在库 header 中显示默认可见性属性。

关于c++ - 为什么 MSVC (Visual C++) 需要单独的 dllimport 和 dllexport 属性而 gcc 不需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58846822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com