Windows中的符号可见性

时间:2012-10-03 22:50:17

标签: c++ windows visual-c++ mingw

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

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

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

1 个答案:

答案 0 :(得分: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。

相关问题