On 30. Sep, 2010, at 13:05 , David Aldrich wrote:

> Hi
> 
> Ok, by following the link to the wiki suggested by Michael Loose, I used:
> 
> target_link_libraries( myProj -Wl,-whole-archive Kernel -Wl,-no-whole-archive)
> 
> This has fixed my problem. The executable links and runs correctly.
> 
> My link command is now:
> 
> /usr/bin/c++   -O3 -DNDEBUG -Wall -m64  -Wl,--export-dynamic   -o myProj 
> -Wl,-whole-archive Kernel/libKernel.a -Wl,-no-whole-archive -ldl -lpython2.4
> 
> I don't need portability so I think this is ok.
> 
> Michael Wild wrote:
> 
>> The -whole-archive flag is pretty useless with executables 
>> (unless, you plan to use it as a library too, but that is 
>> outlandish). --export-dynamic may be also necessary, if 
>> your dlopen'ed libraries use symbols in your executable.
> 
> So my concern is now: am I being 'outlandish' ?  The dlopen'ed libraries do 
> use functions in libKernel.a that is linked to the executable. Is this 
> outlandish? Is there a better way?

The "outlandish" referred to using an executable also as a library, so you're 
fine :-) But I think I found the reason for why you need this -whole-archive 
flag: Since your executable doesn't use all of the functions in the Kernel 
library, the linker throws them away. This results in your dlopen'ed functions 
to fail.

So, the options are:

- use -whole-archive as you do now
- make the Kernel library shared
- link the dlopen'ed libraries against Kernel

Michael


Attachment: PGP.sig
Description: This is a digitally signed message part

_______________________________________________
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