【问题标题】:How to create a custom target that copies a library?如何创建复制库的自定义目标?
【发布时间】:2017-10-14 14:14:33
【问题描述】:

我正在尝试创建一个仅将库复制到 LIBRARY_OUTPUT_PATH 的自定义目标。下面是我的 CMakeLists.txt。

MYCOMPONENT文件夹的内容是mylib.so和CMakeLists.txt。

cmake_minimum_required(VERSION 2.8)
project( MYCOMPONENT )
add_custom_target( MYTARGET
                   COMMAND ${CMAKE_COMMAND} -E copy ./mylib.so ${LIBRARY_OUTPUT_PATH} )

我执行以下操作:

cd MYCOMPFOLDER
mkdir build_debug
cd build_debug
cmake -DLIBRARY_OUTPUT_PATH=<mycompfolderfullpath>/build_debug/bin ..

现在我执行 build_debug 的 ls 并得到:

CMakeCache.txt CMakeFiles cmake_install.cmake Makefile

ls CMakeFiles/
3.5.1                            CMakeTmp           Makefile2
cmake.check_cache                feature_tests.bin  Makefile.cmake
CMakeDirectoryInformation.cmake  feature_tests.c    progress.marks
CMakeOutput.log                  feature_tests.cxx  TargetDirectories.txt
CMakeRuleHashes.txt              MYCOMPONENT.dir

ls CMakeFiles/MYCOMPONENT.dir/
build.make  cmake_clean.cmake  DependInfo.cmake  progress.make

从 build_debug 中,“find . -name mylib.so”不存在,所以“make MYTARGET”当然会失败。如何让 cmake 正确处理 mylib.so?这是第三方库,我们不构建它,目标是确保将其从该文件夹复制到 LIBRARY_OUTPUT_PATH,以便其他组件可以从那里链接到它。

【问题讨论】:

  • 如果我理解正确,复制失败,因为构建目录中没有mylib.so。显然,您需要指定正确的文件路径才能成功复制。 什么是问题? 你问mylib.so 在你的机器上的位置吗?只有你自己知道。
  • 在进行源外树构建时,cmake 将文件从源文件夹复制到新树 - mylib.so 不会被复制,只有 CMakeLists.txt 文件。这就是我要问的。为什么不像我的工作区中的所有其他文件一样将它复制到源树外路径中。我知道文件在哪里,如果这是正常的 cmake 行为,那么我将复制 ../mylib.so (相对于 build_debug 文件夹),但源树外构建似乎并不奇怪复制这个文件。它不是源代码树中唯一的二进制文件——我们也预编译了着色器。
  • 你错了:nothing会自动从source tree复制到binary tree。仔细看:构建树中没有CMakeLists.txt。在任何情况下,如果您想将mylib.so 复制到其他位置,只需从源代码树 (${CMAKE_SOURCE_DIR}/mylib.so) 复制即可。

标签: cmake


【解决方案1】:

不要在-E copy 部分使用相对路径。变量 CMAKE_SOURCE_DIRCMAKE_CURRENT_SOURCE_DIRCMAKE_BINARY_DIRCMAKE_CURRENT_BINARY_DIR 供您使用。

【讨论】:

  • 感谢大家的澄清。在有响应之前,我曾尝试使用 PROJECT_SOURCE_DIR,效果也不错。
猜你喜欢
  • 2012-01-24
  • 2011-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多