On 12/06/2011 10:42 AM, Totte Karlsson wrote:
> Thanks for feedback
>>
>> You misunderstand and misuse the DEFINE_SYMBOL property. All the
>> IMPORT_X_DLL symbols are wrong, you have to remove them.
> 
> But when building the B, and C dll the import symbols need to be defined
> somehow. See my export/import header below.

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.

> 
> CMake will only
>> add the DEFINE_SYMBOL when *building* the specified target, and
>> otherwise just leave it away.
> Not sure I understand.
> 

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.

> 
>> 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
>>
> 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?

> 
> Is the problem perhaps that the EXPORT_COMMON_DLL defined symbol is not
> "undeffed" so when the B DLL need to Import from A, it can't?

If you are referring to your original code, that was completely broken.
As I explained above, if you have a structure like this


add_library(A SHARED a.cpp)
add_library(B SHARED b.cpp)
target_link_libraries(B A)

the following will happen:

- A.cpp is compiled with -DA_EXPORTS. The DEFINE_SYMBOL property for
target B is ignored.

- DLL A is created

- B.cpp is compiled with -DB_EXPORTS. The DEFINE_SYMBOL property for
target A is ignored.

- DLL B is created and linked against A


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

Michael
--

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

Reply via email to