C++能否从DLL中导出类?

9
我想知道在VC++中导出 (__declspec(dllexport)) 是否属于某种标准( ANSI,ISO,...)
我想知道是否有人已经尝试使用Intel C++编译器和GCC(在Windows上的mingw),以及是否可以混合使用从不同编译器生成的DLL(我真的怀疑这是可能的)
谢谢

这个问题的想法是能够在不同的系统(win、linux、*bsd)上编译代码,但在Windows上进行开发(我喜欢Visual Studio和它提供的工具(尤其是在即将推出的版本中,所有并行工具都可用!!)),然后使用mingw和msvc在Windows上快速编译以检查代码是否“看起来”正常。这将使移植到Linux更快、更容易。 - user246456
4个回答

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添加为预处理器定义(在Project | NAME Properties..下的C/C++ | Preprocessor | Preprocess Definitions中找到)。这样,在构建DLL时,您将导出它们,在使用DLL时将其导入,并在Unix下不做任何特殊处理。

这是否意味着我们可以导出一个类并立即重用它?这是系统特定的(POSIX),还是编译器(在Linux上使用Intel C++提供相同的行为)? - user246456
这取决于Intel C++或gcc编译器标志,但默认情况下会暴露符号。只需创建一些预处理宏,以便可以有条件地编译出口。 - Andrew McGregor
R Samuel,我们如何在POSIX共享对象中隐藏一个类? - Muhammad Hasan Khan

4
现在可以使用GCC编译器/链接器堆栈仅从DLL [Windows]或SO [* nix]中导出特定符号[类/ API]。有关如何执行此操作的相当好的概述,请参阅http://gcc.gnu.org/wiki/Visibility。请注意,保留HTML标记。

2

在C++中,以__开头的任何内容都是供应商特定的扩展。我不知道其他编译器供应商是否支持此功能,但它绝对不是跨编译器兼容的。


+1,虽然我相信MinGW支持这个特定的微软扩展,以使代码移植更容易。与VC++不同,MinGW不需要它。 - Warren Young

2

DLL的概念非常与平台相关,没有任何普遍适用的标准。实际上,DLL这个缩写通常仅用于Windows动态库。需要注意的是,在C/C++中支持DLL的任何内容都非常依赖于平台/供应商。


1
实际上,OS2也使用了DLL。但是它曾经是微软和IBM之间共享的代码... :-) - Jason D

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接