使用可见性属性(不使用 __declspec(dllexport))时,Clang 可以生成导入库吗?

Mar*_*ram 3 c++ windows dll clang

使用 Microsoft 编译器时,要从库中导出类或函数,您将使用类似于以下的代码:

class __declspec(dllexport) Foo {};

使用 Clang(和 GCC),您可以使用 Visibility 属性来确保符号可见:

class __attribute__((visibility(default))) Foo {};

或者依赖编译时设置的可见性。

当我在 Windows 上使用 Clang 进行编译时,如果类可见(即使具有显式属性),则不会导出该函数(不会创建导入库)。

是否可以让 Clang 生成导入库而不使用__declspec(dllexport)Clang大多数但不完全支持的 Microsoft 扩展。

mst*_*sjo 5

澄清一些事情;生成导入库的不是编译器 (Clang) 本身,而是链接器,并且目标文件格式在此过程中起着重要作用。

调整通过哪些符号导出__attribute__((visibility(default)))(当使用 标记其他符号为隐藏时__attribute__((visibility(hidden))),或使用类似 之类的设置默认值时-fvisibility=hidden,在构建 ELF 对象文件时适用于 GCC 和 Clang。COFF 没有类似的每个符号可见性标志。

当使用 MS link.exe 或 LLVM 的 lld-link(模仿 link.exe 的行为)链接 DLL 时,仅导出标有__declspec(dllexport)或在传递给链接器的 def 文件中列出的符号。

在 MinGW 生态系统中(它带来了更多类似 UNIX 的行为),如果没有明确选择任何符号,默认情况下会导出所有全局符号(使用一定量的逻辑来避免导出属于 mingw 基础库本身的东西)待出口。

如果使用 lld-link 而不是 MS link.exe 进行链接(如果直接调用链接器,则通过调用 lld-link 而不是 link,或者-fuse-ld=lld如果通过 clang-cl 前端调用链接器,则通过添加),您可以选择此选项通过添加 lld 特定选项来实现 lld 行为-lldmingw,这会在 lld 中启用许多 MinGW 特定行为。