首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用可见性属性(没有__declspec(dllexport))时,Clang能生成导入库吗?

问当使用可见性属性(没有__declspec(dllexport))时,Clang能生成导入库吗?
EN

Stack Overflow用户
提问于 2019-11-17 23:24:34
回答 2查看 3.7K关注 0票数 3

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

class __declspec(dllexport) Foo {};

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

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

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

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

是否有可能让Clang生成一个导入库,而不使用Clang主要但不完全支持的Microsoft。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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特定行为。

票数 5
EN

Stack Overflow用户

发布于 2020-06-13 13:02:42

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

代码语言:javascript
复制
clang -shared structs.c -o structs.dll -Wl"/DEF:structs.def"

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58906175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档