Re: [CMake] How to specify -fpic ?
On 30. Sep, 2010, at 18:10 , David Aldrich wrote: > Hi Marcel > >> Considering all the hassle you have to go through. Why don't you build a >> shared libKernel.so library and let the runtime loader fix all the >> issues you're now trying to solve compile/link time? > > Thanks for your suggestion. I'm not sure how that would work out. At start-up > the runtime linker would only need to resolve issues between main.cpp, > libKernel.so and libPython.so. Later I will dlopen some more libraries that > need libKernel. Would the runtime linker handle that? > > BR > > David yes, because shared when a shared library is created, ALL symbols get included (provided they are exported, which is the default on *NIX systems). Michael -- There is always a well-known solution to every human problem -- neat, plausible, and wrong. H. L. Mencken 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
Re: [CMake] How to specify -fpic ?
Hi Marcel > Considering all the hassle you have to go through. Why don't you build a > shared libKernel.so library and let the runtime loader fix all the > issues you're now trying to solve compile/link time? Thanks for your suggestion. I'm not sure how that would work out. At start-up the runtime linker would only need to resolve issues between main.cpp, libKernel.so and libPython.so. Later I will dlopen some more libraries that need libKernel. Would the runtime linker handle that? BR David ___ 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
Re: [CMake] How to specify -fpic ?
On Thu, 2010-09-30 at 12:30 +0100, David Aldrich wrote: > Hi Michael > > > So, the options are: > > > > - use -whole-archive as you do now > > - make the Kernel library shared > > - link the dlopen'ed libraries against Kernel > > Thanks very much - I understand. I think I will keep the -whole-archive method. > > However, now I'm worried about how I link in the Python library: > > /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic -Wl,-whole-archive Kernel/libKernel.a -Wl,-no-whole-archive -ldl -lpython2.4 > > The dlopen'ed libraries may use the Python library. I guess I could include it in the -whole-archive part, but perhaps it would be better to link each shared library against Python. Would you agree? > > Sorry that I am now off topic w.r.t cmake. > > By the way, I think I am pretty much there with changing our build system from manually coded makefiles to cmake. I like cmake! Thanks for all your help in getting there. The support on this list is excellent. > > Best regards > > David > Hi David, Considering all the hassle you have to go through. Why don't you build a shared libKernel.so library and let the runtime loader fix all the issues you're now trying to solve compile/link time? Best regards, Marcel Loose. ___ 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
Re: [CMake] How to specify -fpic ?
On 30. Sep, 2010, at 13:30 , David Aldrich wrote: > Hi Michael > >> So, the options are: >> >> - use -whole-archive as you do now >> - make the Kernel library shared >> - link the dlopen'ed libraries against Kernel > > Thanks very much - I understand. I think I will keep the -whole-archive > method. > > However, now I'm worried about how I link in the Python library: > > /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic -Wl,-whole-archive > Kernel/libKernel.a -Wl,-no-whole-archive -ldl -lpython2.4 > > The dlopen'ed libraries may use the Python library. I guess I could include > it in the -whole-archive part, but perhaps it would be better to link each > shared library against Python. Would you agree? > Unless the python library is static (which it AFAIK almost never is) you should be safe. > Sorry that I am now off topic w.r.t cmake. > > By the way, I think I am pretty much there with changing our build system > from manually coded makefiles to cmake. I like cmake! Thanks for all your > help in getting there. The support on this list is excellent. ;-) well, CMake does have its quirks and dark corners, but in general I find it to be much preferable over anything else I've ever seen so far... Michael > > Best regards > > David > >> -Original Message- >> From: Michael Wild [mailto:them...@gmail.com] >> Sent: 30 September 2010 12:20 >> To: David Aldrich >> Cc: cmake@cmake.org >> Subject: Re: [CMake] How to specify -fpic ? >> >> >> 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 >> > -- There is always a well-known solution to every human problem -- neat, plausible, and wrong. H. L. Mencken 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
Re: [CMake] How to specify -fpic ?
Hi Michael > So, the options are: > > - use -whole-archive as you do now > - make the Kernel library shared > - link the dlopen'ed libraries against Kernel Thanks very much - I understand. I think I will keep the -whole-archive method. However, now I'm worried about how I link in the Python library: /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic -Wl,-whole-archive Kernel/libKernel.a -Wl,-no-whole-archive -ldl -lpython2.4 The dlopen'ed libraries may use the Python library. I guess I could include it in the -whole-archive part, but perhaps it would be better to link each shared library against Python. Would you agree? Sorry that I am now off topic w.r.t cmake. By the way, I think I am pretty much there with changing our build system from manually coded makefiles to cmake. I like cmake! Thanks for all your help in getting there. The support on this list is excellent. Best regards David > -Original Message- > From: Michael Wild [mailto:them...@gmail.com] > Sent: 30 September 2010 12:20 > To: David Aldrich > Cc: cmake@cmake.org > Subject: Re: [CMake] How to specify -fpic ? > > > 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 > ___ 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
Re: [CMake] How to specify -fpic ?
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 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
Re: [CMake] How to specify -fpic ?
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? Thanks for your help so far. Best regards David ___ 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
Re: [CMake] How to specify -fpic ?
Hi > I tried adding: > > SET(CMAKE_EXE_EXPORTS_CXX_FLAG "-Wl,--export-dynamic") > > But that made no difference to the link command. Am I doing the right thing? Fixed this by doing: SET(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") ... SET_TARGET_PROPERTIES(zodiac PROPERTIES ENABLE_EXPORTS ON) I now have: /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -Wl,--export-dynamic -o myProj Kernel/libKernel.a -ldl -lpython2.4 But I still have the shared library load error. So now I need to try implementing -whole-archive/--no-whole-archive to see if that makes a difference. Any hints how to do this please? David ___ 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
Re: [CMake] How to specify -fpic ?
Hi Michael > For one, you are missing -ldl. Add ${CMAKE_DL_LIBS} to your > target_link_libraries call. Thanks for pointing that out. It's in there now: /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic Kernel/libKernel.a -ldl -lpython2.4 > --export-dynamic may be also necessary, if your dlopen'ed > libraries use symbols in your executable. I tried adding: SET(CMAKE_EXE_EXPORTS_CXX_FLAG "-Wl,--export-dynamic") But that made no difference to the link command. Am I doing the right thing? David ___ 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
Re: [CMake] How to specify -fpic ?
On 30. Sep, 2010, at 11:15 , David Aldrich wrote: > Hi Michael > > Thanks for your reply. > >> The only difference between -fpic and -fPIC is that the latter has no limit >> on the size of the global offsets table and this is only relevant for the >> m68k, PowerPC and SPARC architectures (according to the GCC manual page). > > Yes, we aren't using those architectures. > >> Are you using -fvisibility=hidden somewhere? > > No. > >> Is this option the only difference of the link commands? > > Actually, the shared library linker commands are similar but the executable > linker commands are quite different. > > CMake: > > /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic Kernel/libKernel.a > -lpython2.4 > > Manual make: > > g++ -o myProj -ldl -Wl,-whole-archive,-export-dynamic ../Kernel/libKernel.a > -lboost_python-mt -lpython2.4 -Wl,--no-whole-archive > > I will have to analyse these flags. Any thoughts on the use of > -whole-archive/--no-whole-archive here please? > > BR > > David For one, you are missing -ldl. Add ${CMAKE_DL_LIBS} to your target_link_libraries call. 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. Michael -- There is always a well-known solution to every human problem -- neat, plausible, and wrong. H. L. Mencken 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
Re: [CMake] How to specify -fpic ?
On Thu, 2010-09-30 at 10:15 +0100, David Aldrich wrote: > Hi Michael > > Thanks for your reply. > > > The only difference between -fpic and -fPIC is that the latter has no limit > > on the size of the global offsets table and this is only relevant for the > > m68k, PowerPC and SPARC architectures (according to the GCC manual page). > > Yes, we aren't using those architectures. > > > Are you using -fvisibility=hidden somewhere? > > No. > > > Is this option the only difference of the link commands? > > Actually, the shared library linker commands are similar but the executable linker commands are quite different. > > CMake: > > /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic Kernel/libKernel.a -lpython2.4 > > Manual make: > > g++ -o myProj -ldl -Wl,-whole-archive,-export-dynamic ../Kernel/libKernel.a -lboost_python-mt -lpython2.4 -Wl,--no-whole-archive > > I will have to analyse these flags. Any thoughts on the use of -whole-archive/--no-whole-archive here please? > > BR > > David See this yesterday's mail: http://www.mail-archive.com/cmake@cmake.org/msg31781.html HTH, Marcel Loose. ___ 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
Re: [CMake] How to specify -fpic ?
Hi Michael Thanks for your reply. > The only difference between -fpic and -fPIC is that the latter has no limit > on the size of the global offsets table and this is only relevant for the > m68k, PowerPC and SPARC architectures (according to the GCC manual page). Yes, we aren't using those architectures. > Are you using -fvisibility=hidden somewhere? No. > Is this option the only difference of the link commands? Actually, the shared library linker commands are similar but the executable linker commands are quite different. CMake: /usr/bin/c++ -O3 -DNDEBUG -Wall -m64 -o myProj -rdynamic Kernel/libKernel.a -lpython2.4 Manual make: g++ -o myProj -ldl -Wl,-whole-archive,-export-dynamic ../Kernel/libKernel.a -lboost_python-mt -lpython2.4 -Wl,--no-whole-archive I will have to analyse these flags. Any thoughts on the use of -whole-archive/--no-whole-archive here please? BR David ___ 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
Re: [CMake] How to specify -fpic ?
On 29. Sep, 2010, at 18:25 , David Aldrich wrote: > Hi > > My C++ code consists of an executable and several shared libraries. > > With my CMake build files, I find that the executable fails to load the > shared libraries ( the dlopen() call results in error 'undefined symbol...' ). > > The software works fine under our production build system that uses manually > coded makefiles. > > I notice that the production system linker command invokes -fpic, while CMake > uses -fPIC. I am wondering if that is the reason. > > I set the compile flags with: > > set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -Wall -m64" ) > > How can I replace -fPIC with -fpic in CMake please? > > Best regards > David The only difference between -fpic and -fPIC is that the latter has no limit on the size of the global offsets table and this is only relevant for the m68k, PowerPC and SPARC architectures (according to the GCC manual page). So I really doubt this is the problem. Are you using -fvisibility=hidden somewhere? Michael -- There is always a well-known solution to every human problem -- neat, plausible, and wrong. H. L. Mencken 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
Re: [CMake] How to specify -fpic ?
On 09/29/2010 06:25 PM, David Aldrich wrote: > Hi > > My C++ code consists of an executable and several shared libraries. > > With my CMake build files, I find that the executable fails to load the > shared libraries ( the dlopen() call results in error 'undefined symbol...' ). > > The software works fine under our production build system that uses manually > coded makefiles. > > I notice that the production system linker command invokes -fpic, while CMake > uses -fPIC. I am wondering if that is the reason. > > I set the compile flags with: > > set( CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -Wall -m64" ) > > How can I replace -fPIC with -fpic in CMake please? STRING(REGEX REPLACE "-fPIC" "-fpic" CMAKE_SHARED_LIBRARY_CXX_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) Is this option the only difference of the link commands? Do the compile commands differ, too? Are there any options in the compile commands which should also be present in the link commands but are missing? Regards, 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