在 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++
有没有办法通过 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++