[CMake] import/export and DLL's

Totte Karlsson totte at dunescientific.com
Tue Dec 6 19:49:18 EST 2011


 > Well, then just use add_definitions(-DIMPORT_X_DLL). If -DEXPORT_X_DLL
 > is present, it will override your export/import header definitions for
 > the import case, and everything should be fine.

Not sure what you mean by override. If both symbols are defined, MTK_COMMON will 
be defined as __declspec(dllexport) and not __declspec(dllimport), since my 
headers have #elif, #not elses.
Using add_definitions makes sense however. I just started using CMake two days 
ago and was not aware of that command.

 >> CMake will only
 >>> add the DEFINE_SYMBOL when *building* the specified target, and
 >>> otherwise just leave it away.
 >
 > When CMake invokes the compiler to *build* the DLL it adds
 > -DEXPORT_X_DLL. If the DLL is being *used* it doesn't do anything.

That is the problem. When you say it does not do anything,(in the 'use' case) it 
is in fact defining the dllimport flag (after your #else).

The way my define structure looks, that does not happen.

 >>> So, in your code you do something like this:
 >>>
 >>> #ifdef EXPORT_A_DLL
 >>> #define A_API __declspec(dllexport)
 >>> #else
 >>> #define A_API __declspec(dllimport)
 >>> #endif
No, I'm not doing that in my code. But I tried it, and together with 
target_link_library everything compiles fine. In my opinion, however, those 
#defines gives you something defined, without defining anything.. that is a 
little too clever in my opinion. But practical.

 >> I'll try to see if that works. Right now I do have an exporter/importer
 >> header and it is more complex and looks like (for a target "COMMON"):
 >> #if defined(EXPORT_COMMON_DLL)
 >>      #define MTK_COMMON __declspec(dllexport)
 >> #elif defined(IMPORT_COMMON_DLL)
 >>      #define MTK_COMMON __declspec(dllimport)
 >> #elif defined(EXPORT_COMMON_PKG)
 >>      #define MTK_COMMON __declspec(package)
 >> #elif defined(IMPORT_COMMON_PKG)
 >>      #define MTK_COMMON __declspec(package)
 >> #else
 >>      #define MTK_COMMON
 >> #endif
 >
 > Is this for embarcadero c++? in which case do you define
 > EXPORT_COMMON_DLL, and when do you use EXPORT_COMMON_PKG?

The package spec is a embarcadero flavor of a dll (that can be installed in the 
IDE). That is why I need elseifs, and not just an else.


 >
 >
 > To help you more, I would need to understand __declspec(package). The
 > Embarcadero docs didn't really help me grasp its use...

The main difference compared to a regular DLL It gives the dll a handle to the 
main application I think. Embarcadero packages has .bpl as extension. It has 
nothing to do with why my dll could not get symbols from another dll.

Well, seems that the target_link_libraries and the add_definitions did it!

Thanks for your feedback!
Totte


More information about the CMake mailing list