【发布时间】:2020-01-06 17:29:06
【问题描述】:
有没有办法打印通过 target_link_libraries 命令链接到目标的库的文件名列表
或者更好的是,是否将目标的所有依赖项复制到特定文件夹?
【问题讨论】:
标签: cmake
有没有办法打印通过 target_link_libraries 命令链接到目标的库的文件名列表
或者更好的是,是否将目标的所有依赖项复制到特定文件夹?
【问题讨论】:
标签: cmake
get_target_property(OUT Target LINK_LIBRARIES)
message(STATUS ${OUT})
【讨论】:
其实不是(*)。
但是,您可以使用 cmake 变量来收集要链接的库的名称(使用 set( ... 或 list(APPEND ... 命令),然后在您的 target_link_libraries 命令中使用此变量:
target_link_libraries(<targetname> ${YOUR_CMAKE_VARIABLE})
同样的变量也可以用来创建你的复制命令(例如使用this custom target)
【讨论】:
我意识到这并不能完全回答关于在 cmake 中执行此操作的问题,但我遇到了类似的问题并认为我应该分享我的解决方案。
首先,在您的源目录(“项目”)中:
$ mkdir build && cd build
$ cmake ..
然后,使用graphviz创建一个点文件,如this answer:
$ cmake --graphviz=graph.dot .
然后,从图中为您的目标去除依赖关系(我们称之为“foo”):
$ sed -n 's/.*label="\(.*\)"\s.*/\1/p' graph.dot.foo > foo_dependencies.txt
现在,消除混乱:
$ rm graph.dot*
【讨论】:
嗯,所有链接到给定目标 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++
【讨论】: