3

我在 linux 中进行了大量编程,我使用可见性属性来定义符号在共享对象中是可见还是隐藏。只是为了让事情更清楚:如果一个符号是可见的,它将可以从外部访问(有人与共享对象链接),如果它是隐藏的,它应该只在内部使用。

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

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

4

1 回答 1

7

David Rodriguez 是正确的,在 MSVC 环境中,程序员通常通过特定于 MSVC 的__declspec(dllexport)修饰符显式导出函数/类符号。未显式导出的符号不应显示在已编译 DLL 的符号表中(您可以使用/EXPORTS 选项使用 Visual Studio 命令行实用程序之一的dumpbin进行验证)。导入该符号时使用 dllimport 是惯例,尽管我认为这是可选的。这通常是如何发挥作用的,定义 DLL 的公共接口的头文件将具有一些默认扩展为 __declspec(dllimport) 的宏,但在构建该库时设置为扩展为 __declspec(dllexport)。

请注意,GCC 和 MSVC 对待 dllexport 的方式可能不同;在隐藏未导出符号的意义上,也许 GCC 不“尊重” dllexport ?在尝试使用 GCC 之前,我会先尝试使用 MSVC 编译并使用 dumpbin 测试这些结果。如果您没有 Visual Studio,您仍然可以通过下载 VS Express 或(鲜为人知)通过下载命令行 MSVC 附带的某些 .NET 可再发行组件来获得 MSVC 编译器(这两个选项都是免费且合法的)。VS Express 在这里可能是更好的选择,因此您可以获得垃圾箱。

于 2012-10-03T23:22:04.097 回答