[CMake] import/export and DLL's

Totte Karlsson totte at dunescientific.com
Tue Dec 6 19:59:51 EST 2011


On 12/6/2011 8:10 AM, Michael Jackson wrote:
> Read this article.
>
> http://www.cmake.org/Wiki/BuildingWinDLL
Yeah, I did start with that one. My main problem was (as M. Wild) pointed out, 
defining the build flags correctly. I ended up using
add_definitions(-DEXPORT_MOLECULE_DLL)

In the article, the
SET_TARGET_PROPERTIES (MyLibrary PROPERTIES DEFINE_SYMBOL  "COMPILING_DLL" )
construct is used. What is the difference?

Also, my dll's links to other dll's and that is not in the article. So I needed 
to use target_link_libraries(...) for those.

I also had a more complex #define structure:
#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
forcing the user to #define everything needed. In the example that is not the 
case since the dllimport is defined "automatically" if not building a dll.

I ended up changing my #define structure to
#if defined(EXPORT_COMMON_DLL)
     #define MTK_COMMON __declspec(dllexport)
#elif defined(EXPORT_COMMON_PKG)
     #define MTK_COMMON __declspec(package)
#elif defined(IMPORT_COMMON_PKG)
     #define MTK_COMMON __declspec(package)
#else
     #define MTK_COMMON __declspec(dllimport)
#endif

which is more user friendly.

Thanks for feedback,
Regards,
Totte

>
> If you have questions after that please post. That article should clear everything up.
>
> Thanks
> ___________________________________________________________
> Mike Jackson                    Principal Software Engineer
> BlueQuartz Software                            Dayton, Ohio
> mike.jackson at bluequartz.net              www.bluequartz.net
>
> On Dec 6, 2011, at 3:47 AM, Totte Karlsson wrote:
>
>> Hi,
>> I have a project where several DLL's are to be built, say A, B and C.
>> B needs to import functions/classes from A, and C need to import functions from both A and B.
>> In each library, a flag is defined for exporting or importing, i.e. __declspec(dllexport) or __declspec(import)
>>
>> The build order is first A, then B and then C.
>> I have defined build flags in CMakeList.txt files as, in A for example
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "EXPORT_A_DLL")
>>
>> in B
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "EXPORT_B_DLL")
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "IMPORT_A_DLL")
>>
>> and in C
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "EXPORT_C_DLL")
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "IMPORT_A_DLL")
>>     SET_TARGET_PROPERTIES (${target} PROPERTIES DEFINE_SYMBOL  "IMPORT_B_DLL")
>>
>> The only dll that seem to be built OK is A. In B and C, nothing seem to be exported.
>> Any tips on how to deal with this?
>> I am using CodeGear platform. Building static libs works fine.
>>
>> -totte
>>
>> --
>> .........................
>> Totte Karlsson, Ph.D.
>> Dune Scientific, LLC
>> 425-296 1980 (office)
>> 425-780 9648 (cell)
>> www.dunescientific.com
>> .........................
>>
>>
>> --
>>
>> Powered by www.kitware.com
>>
>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>
>> Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ
>>
>> Follow this link to subscribe/unsubscribe:
>> http://www.cmake.org/mailman/listinfo/cmake
>


More information about the CMake mailing list