Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can C++ export class from DLL

Tags:

c++

dll

I would like to know if the export of class ( __declspec(dllexport) in VC++ ) is a kind of standard ( ANSI , ISO , ... )
I would like to know if someone has already try to do the same with intel c++ compiler and gcc ( mingw on windows ) and if it is possible to mix dlls generated from different compilers ( I really doubt that it is possible )

Thx

like image 562
user246456 Avatar asked Jan 16 '10 01:01

user246456


2 Answers

No, __declspec is VC++ specific.

One of the reasons that VC++ needs that is by default, DLLs do not expose symbols outside the DLL unless explicitly requested to do that. On Posix, shared objects expose all their (not-static) symbols unless explicitly told to hide them.

Update

Based on your comment that you want to make your code portable, you want to use the preprocessor and do something like this:

#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
{ ... };

In the project implementing the class, make sure to add EXPORT_CLASS_FOO as a preprocessor definition (found in Project | NAME Properties.. under C/C++ | Preprocessor | Preprocess Definitions). This way, you'll export them when building the DLL, import them when you are using the DLL and do nothing special under Unix.

like image 123
R Samuel Klatchko Avatar answered Oct 06 '22 01:10

R Samuel Klatchko


It is now possible to export only certain symbols [ Classes / API ] from a DLL [on Windows] or a SO [on *nix] using the GCC compiler/linker stack. For a fairly good overview of how to do this, refer to http://gcc.gnu.org/wiki/Visibility.

like image 25
Vish Desai Avatar answered Oct 06 '22 01:10

Vish Desai