2010-01-16 42 views
9

C++出口类我想知道如果(__declspec(dllexport)的在VC++)的出口是一种标准(ANSI,ISO,...)
我想知道的如果有人已经尝试做与英特尔C++编译器和GCC(在Windows MinGW的)相同,如果有可能混合使用不同的编译器生成的DLL(我很怀疑,这是可能的)可以从DLL

THX

+0

这个问题背后的想法是能够跨越不同系统(win,linux,* bsd)编译代码,但要在Windows上开发(我喜欢visual studio及其提供的工具(甚至更多并行工具可用!!)),并用mingw和msvc在windows上快速编译它,以检查代码“看上去”是否正常。这将使端口更快,更容易 – user246456 2010-01-16 01:43:05

回答

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++ |预处理器|预处理定义下的Project | NAME Properties中找到)。这样,在构建DLL时将导出它们,在使用DLL时导入它们,并且在Unix下不做任何特殊处理。

+0

这是否意味着我们可以导出一个类并立即重用它?它是系统特定的(POSIX)还是编译器(Linux上的intel C++提供相同的行为) – user246456 2010-01-16 01:35:25

+0

它取决于Intel C++或gcc上的编译器标志,但默认为公开符号。只需制作一些预处理宏,以便可以有条件编译这种导出。 – 2010-01-16 01:56:38

+0

R塞缪尔我们如何在posix共享对象中隐藏一个类? – 2011-06-25 12:46:58

2

任何以C++开头的东西都是特定于供应商的扩展。我不知道其他编译器厂商是否支持这一点,但它肯定是不兼容的交叉编译器。

+0

+1,尽管我确实相信MinGW支持这个特定的微软扩展,使移植代码更容易。与VC++不同,MinGW不需要它。 – 2010-01-16 01:24:37

2

DLL的概念是非常特定于平台的。它没有被任何远程通用标准覆盖。如果事实上,首字母缩略词DLL本身通常保留给Windows动态库。无需添加,在C/C++中特定于DLL支持的任何东西都非常依赖于平台/供应商。

+1

其实OS2也使用DLL。但它曾经是MS和IBM之间的共享代码...... :-) – 2010-01-16 05:15:11

4

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

相关问题