澄清一些事情;产生导入库的不是编译器(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