【发布时间】:2016-09-15 08:01:32
【问题描述】:
以下是我的场景。我有一个顶级 CMakeList.txt 和另外 2 个内部 CMakeList.txt。在顶级 cmake 中,我有 3 个自定义目标,它们是 copy、build、copyandbuild。正如名称所指定的 make copy 将源目录(即 dir1、dir2)复制到 ${CMAKE_SOURCE_DIR}。 make build 创建库和可执行文件。 make copyandbuild(复制+构建)。
从构建目录运行cmake .. 成功完成。
如果我运行 make copyandbuild 它正在复制到 ${CMAKE_SOURCE_DIR} 但在构建时它显示错误
No rule to make target `dir1/libmylib.so', needed by `CMaketargetdbuild'. Stop
- 我的项目
- 目录1
- CMakeLists.txt
- 目录2
- CMakeLists.txt
- CMakeLists.txt
- 目录1
如果我按以下顺序执行命令,它就可以工作。
- cmake ..
- 进行复制和构建
- cmake ..
- 进行构建
我的要求是它应该在不运行 cmake 的情况下工作并再次进行构建,因为 copyandbuild 做同样的工作。
顶级 CMakeLists.txt:
cmake_minimum_required(VERSION 2.6)
cmake_minimum_required(VERSION 2.6)
set(RE_BUILD make rebuild_cache)
set(OUTPUT_DIR ${CMAKE_SOURCE_DIR}/../)
if(EXISTS ${CMAKE_SOURCE_DIR}/dir1)
message(WARNING "Found dir1 dir")
add_subdirectory(dir1 EXCLUDE_FROM_ALL)
else()
message(WARNING "Couldn't find dir1 directory ")
endif()
if(EXISTS ${CMAKE_SOURCE_DIR}/dir2)
add_subdirectory(dir2 EXCLUDE_FROM_ALL)
else()
message(WARNING "Couldn't find dir2 directory")
endif()
set(MOVE_LIB_COMMAND mv src/myapp . && mv dir1/mylib .)
set(COPY_COMMAND cp -r ../sourceCode1 ../dir1 && cp -r ../sourceCode2 ../dir2)
set(CLEAN_DIR1_COMMAND cmake -E remove_directory ${CMAKE_SOURCE_DIR}/dir1)
set(CLEAN_DIR2_COMMAND cmake -E remove_directory ${CMAKE_SOURCE_DIR}/dir2)
set(SET_SLEEP sync)
#Copy command
add_custom_target(
copy ${COPY_COMMAND}
COMMAND ${RE_BUILD}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)
#Compilation
add_custom_target(
build
COMMAND ${MOVE_LIB_COMMAND}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS mylib myapp
)
#copy and compile
add_custom_target(
copyandbuild
COMMAND ${MOVE_LIB_COMMAND}
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
DEPENDS copy mylib myapp
)
add_custom_command(TARGET copy POST_BUILD
COMMAND ${SET_SLEEP}
)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
dir1 CMake 是:
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
include_directories(
${MY_APP_INCLUDE_DIRS}
)
link_directories(
${MY_APP_LIBDIR}
)
add_library(mylib
SHARED
com/*.cpp
)
target_link_libraries(mylib myapp_lib)
dir2 CMake 是:
cmake_minimum_required(VERSION 2.6)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
include_directories(
${MY_APP_INCLUDE_DIRS}
)
link_directories(
${MY_APP_LIBDIR}
)
【问题讨论】:
-
你能以精简的方式分享 CmakeLists.txt 的内容吗?
-
请清理您的代码 sn-p:使变量一致(例如,您设置变量
RE_BUILD_COMMAND,但使用RE_BUILD),删除未在 sn-p 中使用的变量定义.据我从代码中了解到,您希望 add_custom_target 的 DEPENDS 选项添加来自其他目标的依赖项。但它实际上添加了来自文件的依赖项。要添加目标之间的依赖关系,请使用命令add_dependencies。
标签: cmake