我想知道类(VC ++中的__declspec(dllexport))的输出是否是一种标准(ANSI,ISO,...)
我想知道是否有人已经尝试使用intel c ++编译器和gcc(mingw on windows)以及是否可以混合使用不同编译器生成的dll(我真的怀疑它是否可能)
THX
答案 0 :(得分:9)
不,__declspec是VC ++特定的。
默认情况下VC ++需要的原因之一是,除非明确要求,否则DLL不会在DLL外部公开符号。在Posix上,共享对象公开所有(非静态)符号,除非明确告知隐藏它们。
<强>更新强>
根据您希望使代码可移植的注释,您希望使用预处理器并执行以下操作:
#ifdef WIN32
#ifdef EXPORT_CLASS_FOO
#define CLASS_FOO __declspec(dllexport)
#else
#define CLASS_FOO __declspec(dllimport)
#endif
#else
#define CLASS_FOO
#endif
class CLASS_FOO foo
{ ... };
在实现该类的项目中,确保添加EXPORT_CLASS_FOO作为预处理器定义(在C / C ++ |预处理器|预处理定义下的项目|名称属性..中找到)。这样,你将在构建DLL时导出它们,在使用DLL时导入它们并在Unix下不做任何特殊操作。
答案 1 :(得分:4)
现在可以使用GCC编译器/链接器堆栈从[在Windows]上的DLL或SO [on * nix]中仅导出某些符号[Classes / API]。有关如何执行此操作的相当好的概述,请参阅http://gcc.gnu.org/wiki/Visibility。
答案 2 :(得分:2)
在C ++中以__开头的任何内容都是特定于供应商的扩展。我不知道是否有任何其他编译器供应商支持这一点,但它肯定不兼容交叉编译器。
答案 3 :(得分:2)
DLL的概念非常特定于平台。任何甚至远程普遍适用的标准都不涵盖它。事实上,首字母缩略词DLL本身通常是为Windows动态库保留的。不用说,C / C ++中DLL支持的任何特定内容都与平台/供应商有关。