以下内容不能使用 CMake 2.8.3 为我编译。否 "DIR"变量上的尾部斜杠导致的"//"。如果删除该尾部斜杠,它确实会编译。
有谁知道这是CMake或Make中的错误,还是只是用户错误?
谢谢。
CMakeLists.txt:
SET(DIR ${CMAKE_CURRENT_SOURCE_DIR}/)
FILE(MAKE_DIRECTORY ${DIR})
ADD_CUSTOM_COMMAND(
OUTPUT ${DIR}/test.cc
COMMAND echo "int main(void) { }" > ${DIR}/test.cc
VERBATIM
)
ADD_EXECUTABLE(test ${DIR}/test.cc)
安慰:
-- Configuring done
-- Generating done
-- Build files have been written to: /home/sam/tmp
Scanning dependencies of target test
make[2]: *** No rule to make target `test.cc', needed by `CMakeFiles/test.dir/test.o'. Stop.
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2
这段代码有几个问题:
-
您在
add_custom_command
中使用了 shell 重定向 (>
),但您指定了不通过 shell 处理的VERBATIM
标志。 -
您没有将路径括在引号中,如果它们包含空格,则会导致问题,
set(DIR ...
应该是:set(DIR "${CMAKE_CURRENT_SOURCE_DIR}/")
-
您正在源代码树中创建文件;CMake 通常与源外构建一起使用,因此应在构建树中创建临时文件
-
您可以使用
file(WRITE
来创建文件,这将比调用 shell 更快 -
缺少
cmake_minimum_required
固定CMakeLists.txt
:
cmake_minimum_required(VERSION 2.8)
set(DIR "${CMAKE_CURRENT_BINARY_DIR}")
file(MAKE_DIRECTORY "${DIR}")
file(WRITE "${DIR}/test.cc" "int main(void) {}")
add_executable(test "${DIR}/test.cc")