C++ 使用可见性属性(不带u declspec(dllexport))时,Clang能否生成导入库?

C++ 使用可见性属性(不带u declspec(dllexport))时,Clang能否生成导入库?,c++,windows,dll,clang,C++,Windows,Dll,Clang,使用Microsoft编译器时,要从库中导出类或函数,请使用类似以下代码: 类uuu declspecdllexport Foo{} 使用Clang和GCC,可以使用可见性属性确保符号可见: 类_属性_可见性默认Foo{} 或者依赖于编译时设置的可见性 当我在Windows上使用Clang编译时,如果一个类即使使用显式属性也可见,则不会导出该函数,也不会创建导入库 有没有可能让Clang在不使用Microsoft extension uu DeclSpecdLexport的情况下生成一个导入库,

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

类uuu declspecdllexport Foo{}

使用Clang和GCC,可以使用可见性属性确保符号可见:

类_属性_可见性默认Foo{}

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

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


有没有可能让Clang在不使用Microsoft extension uu DeclSpecdLexport的情况下生成一个导入库,Clang主要但不完全支持该扩展。

澄清一些事情;生成导入库的不是编译器本身,而是链接器和对象文件格式在该过程中起着重要作用

当使用_attribute__visibilityhidden将其他符号标记为隐藏时,或者使用-fvisibility=hidden之类的设置默认值时,调整通过_attribute__visibilitydefault导出的符号,可在构建ELF对象文件时同时使用GCC和Clang。COFF没有类似的每符号可见性标志

将DLL与MS link.exe或模仿link.exe行为的LLVM的lld链接链接时,仅导出标有_declspecdllexport的符号,或导出到链接器的def文件中列出的符号

在MinGW生态系统中,它带来了更多类似于unix的行为,默认情况下,如果没有显式选择要导出的符号,则会导出具有一定逻辑量的所有全局符号,以避免导出属于MinGW基本库本身的内容


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

在@mstorsjo的回答中,下面是一个将def文件传递给clang的示例

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

我为此挣扎了一天,希望它能帮助别人

你能详细说明一下uu declspecdllexport哪个Clang主要但不完全支持,它不支持哪个方面吗?@mstorsjo有几个针对LLVM项目的u declspecdllexport记录的bug;这是我最近提交的一个例子——很公平,这个案例似乎与MSVC的行为有所不同。我很确定,正是LLVM端口激发了微软的创新。他们对此进行了一段时间的研究,直到发现异常处理是一个很难解决的问题。它在VS2017前后变得稳定,并包含在VS安装程序中。@HansPassant Microsoft fork做了什么?谢谢。我希望Clang能够自动将符号标记为导出的,如果它们基于属性或默认值可见,这将允许链接器生成导入库。