在 cmake 中显示目标的链接库列表

Displaying a target's list of linked libraries in cmake

有没有办法通过 target_link_libraries 命令打印链接到目标的库的文件名列表

或者更好的是,将目标的所有依赖项复制到特定文件夹?

其实不是(*).

但是,您可以使用一个 cmake 变量来收集您想要 link 的库的名称(使用 set( ... or the list(APPEND ... 命令),然后在您的 target_link_libraries命令:

target_link_libraries(<targetname> ${YOUR_CMAKE_VARIABLE})

同样的变量也可用于创建您的复制命令(例如使用 this custom target


(*)有人问了类似的问题here,但没有得到明确的答案。

我意识到这并没有完全回答关于在 cmake 中执行此操作的问题,但我遇到了类似的问题并认为我应该分享我的解决方案。

首先,在您的源目录 ("project") 中:

$ mkdir build && cd build
$ cmake ..

然后,使用 graphviz 创建一个点文件,如 this answer:

$ cmake --graphviz=graph.dot .

然后,从图表中删除目标的依赖项(我们称之为 "foo"):

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

现在,消除混乱:

$ rm graph.dot*
get_target_property(OUT Target LINK_LIBRARIES)
message(STATUS ${OUT})

好吧,给定目标 TARGET 的所有链接库都在构建中.../CMakeFiles/TARGET.dir/link.txt.

例如,TARGET=dirac.x、

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

会有大量链接库:

/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++