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

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

class __declspec(dllexport) Foo {};

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

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

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

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

是否可以让Clang生成导入库而无需使用microsoft扩展名__declspec(dllexport),而Clang 主要是但并不完全支持。

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

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

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

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

在MinGW生态系统(带来更多类似于Unix的行为)中,默认情况是如果没有符号,则导出所有全局符号(具有一定的逻辑以避免导出属于mingw基本库本身的内容)明确选择要导出。

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

,

添加到@mstorsjo的答案,这是将def文件传递给clang的示例。

clang -shared structs.c -o structs.dll -Wl"/DEF:structs.def"

我为此苦了一天,希望它能帮助某人(explaination

本文链接:https://www.f2er.com/3084328.html

大家都在问