我尝试为我的CLion项目运行一些基本命令,但它不起作用。这是我的CMake设置。
cmake_minimum_required(VERSION 3.6)
project(hello)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(hello ${SOURCE_FILES})
add_custom_command(OUTPUT hello.out
COMMAND ls -l hello
DEPENDS hello)
add_custom_target(run_hello_out
DEPENDS hello.out)
在CLion中运行run_hello_out时收到以下错误消息。
[100%] Generating hello.out
process_begin: CreateProcess(NULL, ls -l hello, ...) failed.
make (e=2): The system cannot find the file specified.
mingw32-make.exe[3]: *** [hello.out] Error 2
mingw32-make.exe[2]: *** [CMakeFiles/run_hello_out.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/run_hello_out.dir/rule] Error 2
mingw32-make.exe: *** [run_hello_out] Error 2
CMakeFiles\run_hello_out.dir\build.make:59: recipe for target 'hello.out' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/run_hello_out.dir/all' failed
CMakeFiles\Makefile2:73: recipe for target 'CMakeFiles/run_hello_out.dir/rule' failed
Makefile:117: recipe for target 'run_hello_out' failed
应该运行“ls -l hello”并在构建窗口或运行窗口中查看结果。
答案 0 :(得分:1)
即使我正确地设置了全局路径,ls
也不起作用。 CMake需要完整的路径。以下工作并解决了这个问题。
add_custom_command(OUTPUT hello.out
COMMAND "C:\\FULL PATH HERE\\ls" -l hello
DEPENDS hello)
答案 1 :(得分:1)
问题
CMake并不保证其COMMAND
来电的shell上下文,也不会自动搜索COMMAND
本身提供的可执行文件。
它主要将给定的命令放入生成的构建环境中,并取决于它在那里的处理方式。
在您的情况下,我假设您/ CLion在MS Windows cmake
shell中运行mingw32-make
和cmd
。在这种情况下,您必须使用dir
而不是ls
命令:
add_custom_target(
run_hello_out
COMMAND dir $<TARGET_FILE_NAME:hello>
DEPENDS hello
)
可能的解决方案
我看到三种可能的解决方案。
提供bash
shell上下文
include(FindUnixCommands)
if (BASH)
add_custom_target(
run_hello_out
COMMAND ${BASH} -c "ls -l hello"
DEPENDS hello
)
endif()
使用CMake的shell抽象cmake -E
(只有有限数量的命令,例如没有ls
等效命令)
add_custom_target(
run_hello_out
COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_FILE:hello>
DEPENDS hello
)
使用find_program()
搜索可执行文件。
find_program(LS ls)
if (LS)
add_custom_target(
run_hello_out
COMMAND ${LS} -l hello
DEPENDS hello
endif()
<强>参考强>