Cmake add_custom_command中的双斜杠会导致"No rule to make"错误



以下内容不能使用 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

这段代码有几个问题:

  1. 您在add_custom_command中使用了 shell 重定向 ( > ),但您指定了不通过 shell 处理的 VERBATIM 标志。

  2. 您没有将路径括在引号中,如果它们包含空格,则会导致问题,set(DIR ...应该是:set(DIR "${CMAKE_CURRENT_SOURCE_DIR}/")

  3. 您正在源代码树中创建文件;CMake 通常与源外构建一起使用,因此应在构建树中创建临时文件

  4. 您可以使用file(WRITE来创建文件,这将比调用 shell 更快

  5. 缺少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")

相关内容

最新更新