Windows中的符号可见性

And*_*uel 3 c++ windows mingw visual-c++

我在linux中做了很多编程,并使用visibility属性来定义符号在共享对象中是可见还是隐藏.只是为了让事情更清晰:如果一个符号是可见的,它将在外部访问(某人与共享对象链接),如果它被隐藏,它应该只在内部使用.

在Windows上它看起来有点不同,它适用于导出(符号在此处定义在共享对象中,并且可以由与此链接的人访问)和导入(这里我链接到共享对象并且符号被导出那里)符号.但我找不到告诉编译器不导出符号的方法,因为它只能在这里使用,即如果有人链接它,则需要链接器错误.

我的问题是,如果我可以将符号定义为"隐藏"(如在linux的gcc中)以及如何.此外,所有这些在Windows主题中的可见性对我来说有点模糊,我正在寻找一些进一步阅读链接,以更好地了解一切如何工作.

Wei*_*ezy 7

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.

  • @WhozCraig只需使用`-fvisibility = hidden`作为GCC或Clang的命令行开关,你在Linux/UNIX/MacOS X上有完全相同的行为:没有导出,除非你通过定义不同的可见性导出它将符号编码或放入传递给编译器/链接器的符号文件中. (3认同)