[CMake] How to get a list of all the static libraries that a target will link against ?

Angeliki Chrysochou angeliki.chrysochou at gmail.com
Mon Jul 21 14:24:27 EDT 2014


Well try it and see if it works. If you set this variable in a specific
CMakeLists file, it will affect the specific add_library (or
add_executable) that is in that CMakeLists file. With this way you can
control which libraries/executables will be linked with these flags, and
this is the level of control you have.

Cheers!
Angeliki



On Mon, Jul 21, 2014 at 7:05 PM, Glenn Coombs <glenn.coombs at gmail.com>
wrote:

> The problem is that I need to add both -whole-archive and
> -no-whole-archive options.  And I need to control exactly where they occur
> so that only my libraries occur inside the whole archive section.  I'd be
> happy to be proven wrong but I don't think setting CMAKE_EXE_LINKER_FLAGS
> will give me that level of control.
>
> --
> Glenn
>
>
> On 21 July 2014 09:57, Angeliki Chrysochou <angeliki.chrysochou at gmail.com>
> wrote:
>
>> Hi Glenn,
>>
>> Adding linker flags exactly in target_link_libraries is not a very good
>> practice in my opinion. To add specific linker flags to an executable, you
>> can use the variable CMAKE_EXE_LINKER_FLAGS, which you can edit before
>> calling add_executable. You could set this variable accordingly in your
>> static and dynamic CMakeLists.txt to include the flags you wish in the
>> following way:
>>
>> set(CMAKE_EXE_LINKER_FLAGS "-whole-archive")
>>
>> If you set this variable to include more custom linker flags which you
>> want to preserve across libraries, then you should set it in the following
>> way to preserve its old value:
>>
>> set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -whole-archive")
>>
>> If you want to edit linker flags for a shared library or a module target
>> you can use these cmake variables (set them before add_library):
>>
>> CMAKE_SHARED_LINKER_FLAGS
>> CMAKE_MODULE_LINKER_FLAGS
>>
>> Be aware that variables have CMakeLists.txt file scope, so if you set
>> different values in one CMakeLists.txt then they might get overwritten or
>> appended (depending on the way you edit the variable).
>>
>> All the best,
>> Angeliki
>>
>>
>>
>>
>>
>> On Sat, Jul 19, 2014 at 2:39 PM, Glenn Coombs <glenn.coombs at gmail.com>
>> wrote:
>>
>>> Don't all shout at once :-)  I'm guessing there are no easy solutions
>>> then...
>>>
>>> --
>>> Glenn
>>>
>>>
>>> On 28 June 2014 14:33, Glenn Coombs <glenn.coombs at gmail.com> wrote:
>>>
>>>> I have a project which compiles and links into both a stand alone
>>>> executable and a dynamic shared library.  The library and the executable
>>>> link against the same project libraries but have different object files
>>>> containing their entry points: main.o for the executable and dll_main.o for
>>>> the library.  My project heirarchy looks like this (simplified a bit for
>>>> brevity):
>>>>
>>>> CMakeLists.txt
>>>>     mtx_source/CMakeLists.txt
>>>>     mtx_wrapper/CMakeLists.txt
>>>>     testbench/CMakeLists.txt
>>>>
>>>> The top level CMakeLists.txt calls add_subdirectory on the various
>>>> project specific library folders which each build a static library.  The
>>>> testbench folder is the one that builds both the executable and the dynamic
>>>> library.  When building the dynamic library I need to use the linker
>>>> options -whole-archive and -no-whole-archive to force my static project
>>>> libraries to be included into the dynamic library. The problem is how to
>>>> insert the -whole-archive and -no-whole-archive options so that they select
>>>> the correct set of libraries.  Currently in the testbench CMakeLists.txt
>>>> file I have these lines:
>>>>
>>>> set(libs
>>>>     VLC
>>>>     mvea
>>>>     ${SYSTEMC_SUPPORT_LIBRARIES}
>>>>     ${DEVIFSLAVE_LIBRARIES}
>>>>     ${SYSTEMC_LIBRARIES}
>>>>     ${SIM_UTILS_LIBRARIES}
>>>>     ${HWDEBUG_LIBRARIES}
>>>> )
>>>>
>>>> if (NOT STUB_OUT_MTX)
>>>>     list(APPEND libs mtx_wrapper)
>>>> endif()
>>>>
>>>> set(libs_dll ${libs} transif_slave)
>>>>
>>>> if (UNIX)
>>>>     list(INSERT libs_dll 0 -Wl,-whole-archive)
>>>>     list(APPEND libs_dll   -Wl,-no-whole-archive)
>>>> endif()
>>>>
>>>> add_library ( csim_dll SHARED ${sources_dll} ${headers_dll} )
>>>> add_executable( testbench       ${sources}     ${headers}     )
>>>>
>>>> target_link_libraries(csim_dll  ${libs_dll} ${PTHREADS_LIBRARIES} )
>>>> target_link_libraries(testbench ${libs}     ${PTHREADS_LIBRARIES} )
>>>>
>>>> which produces the following link line:
>>>>
>>>> /usr/bin/g++-4.7  -fPIC -m32  -m32 -m32 -fPIC -m32 -O3  -O3 -DHIDEBUG
>>>> -Wl,-Bsymbolic
>>>> -shared -Wl,-soname,libtopazhp.so
>>>> -o libtopazhp.so
>>>> CMakeFiles/csim_dll.dir/dll_main.cpp.o
>>>> CMakeFiles/csim_dll.dir/main_common.cpp.o
>>>> -lm -lrt -lm -lrt
>>>> -Wl,-whole-archive
>>>> ../mvea/VLC/libVLC.a
>>>> ../mvea/libmvea.a
>>>> ../systemCSupport/libsystemc_support.a
>>>> ../devif_slave/libDevifSlave.a
>>>> ../systemC/libsystemc.a
>>>> ../sim_utils/libsim_utils.a
>>>> ../hwdebug/libhwDebug.a
>>>> ../mtx_wrapper/libmtx_wrapper.a
>>>> ../transif/libtransif_slave.a
>>>> -Wl,-no-whole-archive
>>>> -lpthread -lz
>>>> ../systemC/libpthreads_dummy.a
>>>> ../external_mtx/src/external_mtx-build/metag/libmetag.a
>>>> ../external_mtx/src/external_mtx-build/metagcopro/libmetagcopro.a
>>>> ../external_mtx/src/external_mtx-build/metac/vmetastub/libvmetastub.a
>>>> ../external_mtx/src/external_mtx-build/metac/insim/libinsimfpu.a
>>>> ../external_mtx/src/external_mtx-build/mtx/insim-mtxg/libinsim-mtxg.a
>>>> ../external_mtx/src/external_mtx-build/mtx/libmtxc.a
>>>> -ldl -lm -lrt -lm -lrt
>>>>
>>>> The problem is that the 6 external_mtx libraries should have been
>>>> included inside the -whole-archive section.  These libraries are specified
>>>> in the mtx_wrapper folder with a target_link_libraries(mtx_wrapper
>>>> ${METASIM_LIBRARIES}) command.  I have managed to wrap the direct library
>>>> dependencies inside the -whole-archive but I need to ensure that any
>>>> sub-dependencies are included as well (and any dependencies they might have
>>>> recursively).  Any system dynamic libaries (-ldl -lm -lrt etc.) must appear
>>>> after the -no-whole-archive option otherwise the link fails.  The
>>>> mtx_wrapper library can be built in two ways and only one of them will add
>>>> the extra METASIM libraries as a dependency, the other way fakes that code
>>>> internally.  Adding the METASIM libraries via target_link_libraries()
>>>> inside the mtx_wrapper CMakeLists.txt correctly handles that dependency
>>>> when linking the standalone executable but is not working for linking the
>>>> dynamic library.
>>>>
>>>> Is there an easy way to get cmake to handle all this ?  Is there a way
>>>> to get a list of all the static libraries (libXXX.a) that will be included
>>>> on the link line for a target ?
>>>>
>>>> --
>>>> Glenn
>>>>
>>>>
>>>
>>> --
>>>
>>> Powered by www.kitware.com
>>>
>>> Please keep messages on-topic and check the CMake FAQ at:
>>> http://www.cmake.org/Wiki/CMake_FAQ
>>>
>>> Kitware offers various services to support the CMake community. For more
>>> information on each offering, please visit:
>>>
>>> CMake Support: http://cmake.org/cmake/help/support.html
>>> CMake Consulting: http://cmake.org/cmake/help/consulting.html
>>> CMake Training Courses: http://cmake.org/cmake/help/training.html
>>>
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>>
>>> Follow this link to subscribe/unsubscribe:
>>> http://public.kitware.com/mailman/listinfo/cmake
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/cmake/attachments/20140721/a956f666/attachment.html>


More information about the CMake mailing list