使用Microsoft编译器从库导出类或函数时,您将使用类似于以下代码的代码:
class __declspec(dllexport) Foo {};
对于Clang (和GCC),您可以使用可见性属性来确保符号是可见的:
class __attribute__((visibility(default))) Foo {};
或者依赖于编译时的可见性设置。
当我在Windows上使用Clang编译时,如果一个类是可见的(即使具有显式属性),则该函数不会导出(没有创建导入库)。
是否有可能让Clang生成一个导入库,而不使用Clang主要但不完全支持的Microsoft。
发布于 2019-11-18 11:35:28
为了澄清一些问题,产生导入库的不是编译器(Clang)本身,而是链接器和对象文件格式在这个过程中起着很大的作用。
调整通过__attribute__((visibility(default)))导出的符号(无论是用__attribute__((visibility(hidden)))标记其他符号,还是用-fvisibility=hidden之类的东西设置默认值时,在构建ELF对象文件时都与GCC和Clang一起工作。COFF没有类似的符号可见度标志。
当将DLL链接到MS link.exe或LLVM的link(它模仿lin.exe的行为)时,只有标记为__declspec(dllexport)的符号或传递给链接器的def文件中列出的符号才会被导出。
在MinGW生态系统(它带来了更多类似unix的行为)中,如果没有显式选择要导出的符号,则默认情况是导出所有全局符号(具有一定的逻辑以避免导出属于混合库本身的东西)。
如果使用link而不是MS link.exe链接(通过调用link代替链接,如果直接调用链接器,或者如果通过clang前端调用链接器,则添加-fuse-ld=lld ),则可以通过添加lld特定选项-lldmingw来选择这种行为,该选项在lld中启用了许多MinGW特定行为。
发布于 2020-06-13 13:02:42
添加到@mstorsjo的答案中,下面是将def文件传递给clang的示例。
clang -shared structs.c -o structs.dll -Wl"/DEF:structs.def"我为此挣扎了一天,希望它能帮助别人(explaination)
https://stackoverflow.com/questions/58906175
复制相似问题