c – Windows中的符号可见性

我在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.

相关文章

Windows2012R2备用域控搭建 前置操作 域控主域控的主dns:自...
主域控角色迁移和夺取(转载) 转载自:http://yupeizhi.blo...
Windows2012R2 NTP时间同步 Windows2012R2里没有了internet时...
Windows注册表操作基础代码 Windows下对注册表进行操作使用的...
黑客常用WinAPI函数整理之前的博客写了很多关于Windows编程的...
一个简单的Windows Socket可复用框架说起网络编程,无非是建...