我在linux中做了很多编程,并使用visibility属性来定义符号在共享对象中是可见还是隐藏.只是为了让事情更清晰:如果一个符号是可见的,它将在外部访问(某人与共享对象链接),如果它被隐藏,它应该只在内部使用.
在Windows上它看起来有点不同,它适用于导出(符号在此处定义在共享对象中,并且可以由与此链接的人访问)和导入(这里我链接到共享对象并且符号被导出那里)符号.但我找不到告诉编译器不导出符号的方法,因为它必须只在这里使用,即如果有人链接它,则需要链接器错误.
我的问题是,如果我可以将符号定义为“隐藏”(如在linux的gcc中)以及如何.
此外,所有这些在Windows主题中的可见性对我来说有点模糊,我正在寻找一些进一步阅读链接,以更好地了解一切如何工作.
解决方法:
David Rodriguez是正确的,在MSVC环境中,程序员通常通过MSVC特定的__declspec(dllexport)修饰符显式地导出函数/类符号.未显式导出的符号不应显示在已编译DLL的符号表中(您可以使用dumpbin(Visual Studio命令行工具之一)使用/ EXPORTS选项进行验证).在导入该符号时使用dllimport是常规的,尽管我认为这是可选的.这通常如何发挥作用是定义DLL的公共接口的头文件将具有一些默认扩展为__declspec(dllimport)的宏,但是在构建该库时设置为扩展为__declspec(dllexport).
请注意,GCC和MSVC如何处理dllexport可能会有所不同;也许海湾合作委员会不会“隐瞒”dllexport,因为它隐藏了未被出现的符号?我首先尝试使用MSVC进行编译并使用dumpbin测试这些结果,然后再尝试使用GCC.如果您没有Visual Studio,您仍然可以通过下载VS Express来获得MSVC编译器,或者通过下载命令行MSVC附带的某些.NET可再发行组件(不太知名)来获得MSVC编译器(这两个选项都是免费且合法的). VS Express可能是更好的选择,所以你可以得到dumpbin.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。