可以从DLL导出类C ++

时间:2010-01-16 01:18:53

标签: c++ dll

我想知道(VC ++中的__declspec(dllexport))的输出是否是一种标准(ANSI,ISO,...)
我想知道是否有人已经尝试使用intel c ++编译器和gcc(mingw on windows)以及是否可以混合使用不同编译器生成的dll(我真的怀疑它是否可能)

THX

4 个答案:

答案 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支持的任何特定内容都与平台/供应商有关。