Displaying a target's list of linked libraries in cmake

后端 未结 4 2104
谎友^
谎友^ 2021-02-02 13:38

Is there a way to print a list the filenames for the libraries linked into a target via the target_link_libraries command

or even better, have all a target\'s dependenci

相关标签:
4条回答
  • 2021-02-02 13:55

    Actually not(*).

    However, you can use a cmake variable to collect the name of the libraries that you want to link (using the set( ... or the list(APPEND ... command), and then use this variable in your target_link_libraries command:

    target_link_libraries(<targetname> ${YOUR_CMAKE_VARIABLE})
    

    The same variable can also be used to create your copy commands (for example using this custom target)


    (*) A similar question was asked here, and it got no definitive answer.

    0 讨论(0)
  • 2021-02-02 14:02
    get_target_property(OUT Target LINK_LIBRARIES)
    message(STATUS ${OUT})
    
    0 讨论(0)
  • 2021-02-02 14:05

    Well, all linked libraries to a given target TARGET are in the build.../CMakeFiles/TARGET.dir/link.txt.

    For instance, TARGET=dirac.x,

    .../build_intel17_mkl_i8/.less CMakeFiles/dirac.x.dir/link.txt
    

    There will be a large number of linked libraries:

    /cvmfs/it.gsi.de/compiler/intel/17.0/compilers_and_libraries_2017.4.196/linux/bin/intel64/ifort  -Wl,-E  -w -assume byterecl -g -traceback -DVAR_IFORT -i8 -w -assume byterecl -g -traceback -DVAR_IFORT -i8 -O3 -ip CMakeFiles/dirac.x.dir/src/main/main.F90.o  -o dirac.x  -L/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/lib  -L/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/gen1int-build/external/lib  -L/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/pelib-build/external/lib -Wl,-rpath,/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/lib:/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/gen1int-build/external/lib:/tmp/milias-work/software/qch/dirac/devel_trunk/build_intel17_mkl_i8/external/pelib-build/external/lib: libobjlib.dirac.x.a src/pelib/libpelib_interface.a external/lib/libstieltjes.a -limf -lsvml -lirng -lstdc++ -lm -lipgo -ldecimal -lstdc++ -lgcc -lgcc_s -lirc -lsvml -lc -lgcc -lgcc_s -lirc_s -ldl -lc external/pcmsolver/install/lib/libpcm.a /usr/lib/x86_64-linux-gnu/libz.so -limf -lsvml -lirng -lstdc++ -lm -lipgo -ldecimal -lstdc++ -lgcc -lgcc_s -lirc -lsvml -lc -lgcc -lgcc_s -lirc_s -ldl -lc /usr/lib/x86_64-linux-gnu/libz.so src/libxcfun_fortran_bindings.a external/xcfun-build/src/libxcfun.a external/lib/libpelib.a libgen1int_interface.a external/lib/libgen1int.a -Wl,--start-group /cvmfs/it.gsi.de/compiler/intel/17.0/compilers_and_libraries_2017.4.196/linux/mkl/lib/intel64/libmkl_lapack95_ilp64.a -lmkl_intel_ilp64 -qopenmp -Wl,--end-group -Wl,--start-group -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lpthread /usr/lib/x86_64-linux-gnu/libm.so -qopenmp -Wl,--end-group external/pcmsolver/install/lib/libpcm.a external/xcfun-build/src/libxcfun.a external/lib/libpelib.a external/lib/libgen1int.a /cvmfs/it.gsi.de/compiler/intel/17.0/compilers_and_libraries_2017.4.196/linux/mkl/lib/intel64/libmkl_lapack95_ilp64.a -lmkl_intel_ilp64 -lmkl_intel_thread -lmkl_core -lpthread /usr/lib/x86_64-linux-gnu/libm.so -lirng -ldecimal -lstdc++
    
    0 讨论(0)
  • 2021-02-02 14:14

    I realise this doesn't fully answer the question with regards doing it within cmake, but I faced a similar problem and thought I should share my solution.

    First, in your source directory ("project"):

    $ mkdir build && cd build
    $ cmake ..
    

    Then, use graphviz to create a dot file, as in this answer:

    $ cmake --graphviz=graph.dot .
    

    Then, strip out the dependencies from the graph for your target (let's call it "foo"):

    $ sed -n 's/.*label="\(.*\)"\s.*/\1/p' graph.dot.foo > foo_dependencies.txt
    

    Now, remove the clutter:

    $ rm graph.dot*
    
    0 讨论(0)
提交回复
热议问题