通过CMake传递cpplint命令行参数时执行报错,求解决方案
解决CMake中cpplint添加命令行参数失败的问题
我有一个小型CMake项目,原本已将cpplint集成到编译流程中且运行正常。尝试为cpplint调用添加--quiet命令行参数,配置代码如下:
find_program(CPPLINT_EXECUTABLE cpplint) if(CPPLINT_EXECUTABLE) set(CMAKE_CXX_CPPLINT "${CPPLINT_EXECUTABLE} --quiet") set(CMAKE_CXX_CPPLINT_EXTENSIONS "*.cc; *.h") else() message(WARNING "cpplint not found.") endif()
但运行编译时失败,使用CMake版本3.30.2,报错信息如下:
Error running '/usr/local/bin/cpplint --quiet': no such file or directory make[2]: *** [src/CMakeFiles/libxdemo.dir/xdemo.cc.o] Error 1 make[1]: *** [src/CMakeFiles/libxdemo.dir/all] Error 2
问题原因
CMake的CMAKE_CXX_CPPLINT变量需要以列表形式指定程序路径和参数,而非将路径与参数拼接成单个字符串。当你把"${CPPLINT_EXECUTABLE} --quiet"作为单个字符串设置时,CMake会把整个内容当作可执行文件路径去查找,自然找不到/usr/local/bin/cpplint --quiet这个不存在的文件。
修复后的配置代码
将CMAKE_CXX_CPPLINT的设置改为列表形式:
find_program(CPPLINT_EXECUTABLE cpplint) if(CPPLINT_EXECUTABLE) # 用列表形式指定程序和参数,每个元素单独列出 set(CMAKE_CXX_CPPLINT ${CPPLINT_EXECUTABLE} --quiet) set(CMAKE_CXX_CPPLINT_EXTENSIONS "*.cc; *.h") else() message(WARNING "cpplint not found.") endif()
补充说明
- 列表形式的设置会让CMake正确识别:第一个元素是可执行文件路径,后续元素是传递给它的命令行参数。
- 若需添加更多参数,直接在列表后追加即可,例如:
set(CMAKE_CXX_CPPLINT ${CPPLINT_EXECUTABLE} --quiet --linelength=120)
内容的提问来源于stack exchange,提问作者uuu777
相关产品推荐
相关产品推荐

