CMake 常见问题及解决办法

简介: CMake 常见问题及解决办法

前言

本文介绍了一些CMake常见问题及解决办法,主要涉及到Boost库、安装命令、编译器、生成器、缓存文件、路径转义和版本更新等方面。希望本文能够帮助大家更好地使用CMake构建自己的项目。

问题1: Could NOT find Boost (missing: Boost_INCLUDE_DIR filesystem system)

这个问题表示CMake无法找到Boost库的头文件和库文件,通常是因为Boost库没有安装在默认的系统位置,或者没有设置正确的环境变量。一个简单的解决办法是使用sudo apt-get install libboost-all-dev -y命令在Ubuntu系统下安装Boost库,这样CMake就可以自动找到Boost库了。

问题2: file INSTALL cannot find

这个问题表示CMake在执行make install命令时无法找到要安装的文件或目录,通常是因为CMakeLists.txt文件中没有正确地指定install命令的参数。一个简单的解决办法是在CMakeLists.txt文件中添加一个空的cmake-examples.conf文件,例如:

# create an empty file
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/cmake-examples.conf "")
# install the file
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake-examples.conf DESTINATION /etc)

问题3: CMake错误No CMAKE_CXX_COMPILER could be found.

在WSL2下面执行cmake 这个问题表示CMake无法找到C++编译器,通常是因为系统没有安装C++编译器,或者没有设置正确的环境变量。一个简单的解决办法是使用sudo apt-get updatesudo apt-get install -y build-essential命令在Ubuntu系统下安装基本的开发工具,包括gcc和g++编译器。

root@DESKTOP-VRJI187:/mnt/d/Project_2022/cmake-examples/01-basic# cmake .
-- The C compiler identification is GNU 9.4.0
-- The CXX compiler identification is unknown
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
CMake Error at CMakeLists.txt:13 (project):
  No CMAKE_CXX_COMPILER could be found.
  Tell CMake where to find the compiler by setting either the environment
  variable "CXX" or the CMake cache entry CMAKE_CXX_COMPILER to the full path
  to the compiler, or to the compiler name if it is in the PATH.
-- Configuring incomplete, errors occurred!

问题4: CMake - add_executable called with incorrect number of arguments

这个问题表示CMake在调用add_executable命令时没有指定源文件,通常是因为CMake版本不兼容或者源文件不存在。通过实验,我发现在低版本的cmake,例如3.0版本中上面的代码是可以工作的,但是在高版本,例如3.20.0必须指定source文件。一个简单的解决办法是在add_executable命令后面添加源文件的名称,例如:

# add an executable
add_executable(hello_world hello_world.cpp)

问题5: cannot find -lnncase-wrapper

这个问题表示链接器无法找到nncase-wrapper库,通常是因为nncase-wrapper库没有编译或者没有设置正确的链接路径。一个可能的解决办法是修改lib/CMakeLists.txt文件,取消注释以下两行:

--- a/lib/CMakeLists.txt
+++ b/lib/CMakeLists.txt
@@ -2,7 +2,7 @@
 # create driver library
-ADD_SUBDIRECTORY(nncase)
+#ADD_SUBDIRECTORY(nncase)
 FILE(GLOB_RECURSE LIB_SRC
         "${CMAKE_CURRENT_LIST_DIR}/bsp/*.h"
@@ -42,5 +42,5 @@ SET_SOURCE_FILES_PROPERTIES(${ASSEMBLY_FILES} PROPERTIES COMPILE_FLAGS "-x assem
 ADD_LIBRARY(kendryte
         ${LIB_SRC}
         )
-TARGET_LINK_LIBRARIES(kendryte PUBLIC nncase-wrapper)
+#TARGET_LINK_LIBRARIES(kendryte PUBLIC nncase-wrapper)
 SET_TARGET_PROPERTIES(kendryte PROPERTIES LINKER_LANGUAGE C)

这样就可以编译并链接nncase-wrapper库了。如果还有问题,可能跟公司加密系统有关,把临时文件给加密了。

问题6: CMake Error: Could not create named generator UMake Makefiles

这个问题表示CMake无法创建指定的生成器UMake Makefiles,通常是因为输入了错误的生成器名称或者没有安装相应的生成器工具。一个简单的解决办法是检查输入的生成器名称是否正确,并且安装相应的生成器工具。例如,在Windows系统下使用NMake Makefiles生成器,需要安装Visual Studio或者Windows SDK,并且在命令行中输入:

# 提示说只能选择 NMake Makefiles
cmake .. -DPROJ=hello_world -DTOOLCHAIN="c:/kendryte-toolchain/bin" -G "NMake Makefiles"

问题7: CMake This may result in binaries being created in the wrong place

这个问题表示CMake的缓存文件和源文件不匹配,通常是因为更换了源文件或者二进制文件的目录,但是没有删除旧的缓存文件。一个简单的解决办法是删除CMakeCache.txt文件和CMakeFiles目录,然后重新运行CMake命令

问题8: CMake Invalid escape sequence \k

这个问题表示CMake解析路径时遇到了无效的转义序列\k,通常是因为在路径中使用了反斜杠\,而反斜杠在CMake中有特殊的含义,例如\n表示换行符。一个简单的解决办法是在路径中使用正斜杠/,例如:

# set the toolchain path
set(TOOLCHAIN "C:/kendryte-toolchain/bin")

问题9: CMake Error: Error: generator : Unix Makefiles

这个问题表示CMake的生成器和之前使用的生成器不一致,通常是因为更换了生成器,但是没有删除旧的缓存文件。一个简单的解决办法是删除CMakeCache.txt文件和CMakeFiles目录,然后重新运行CMake命令,并且指定相同的生成器。例如,在Windows系统下使用MinGW Makefiles生成器,需要安装MinGW工具,并且在命令行中输入:

PS D:\Project_Docs\kendryte-standalone-sdk\cmake> cmake  -DPROJ=hello_world -DTOOLCHAIN="C:\kendryte-toolchain\bin" -G "Unix Makefiles"
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.
CMake Error: Error: generator : Unix Makefiles
Does not match the generator used previously: MinGW Makefiles
Either remove the CMakeCache.txt file and CMakeFiles directory or choose a different binary directory.
cmake .. -DPROJ=hello_world -DTOOLCHAIN="c:/kendryte-toolchain/bin" -G "MinGW Makefiles"

问题10: CMake 3.0 or higher is required. You are running version 2.8.12.2

这个问题表示CMake的版本低于要求的版本,通常是因为系统安装了旧版本的CMake,或者没有更新CMake的版本。一个简单的解决办法是卸载旧版本的CMake,并且安装新版本的CMake。例如,在Ubuntu系统下,可以使用以下命令:

# 移除旧版本
sudo apt remove cmake
# 下载新版本
wget https://github.com/Kitware/CMake/releases/download/v3.23.2/cmake-3.23.2.tar.gz
# 解压缩
tar -zxvf cmake-3.23.2.tar.gz
# 进入目录
cd cmake-3.23.2
# 配置和编译
./configure
make
#  编译安装
sudo make install
#  查看版本
cmake --version

总结

CMake是一个强大而灵活的构建系统,它可以根据用户编写的CMakeLists.txt文件,生成各种工程文件和Makefile,从而方便用户在不同的平台和开发环境下编译和运行程序。但是在使用过程中也会遇到一些问题和错误,需要我们根据具体情况进行分析和解决。如果后面还遇到Cmake问题 我会继续补充。

如果你有任何问题或建议,欢迎在评论区留言。谢谢你的阅读和支持。

相关文章
|
2月前
|
算法 程序员 编译器
【cmake 踩坑记录】CMake文件安装深入解析:EXCLUDE的奥秘与替代方案
【cmake 踩坑记录】CMake文件安装深入解析:EXCLUDE的奥秘与替代方案
42 0
|
6月前
|
并行计算 关系型数据库 MySQL
Cmake 使用备忘
Cmake 使用备忘
|
12月前
|
Python
pip安装termcolor失败解决方法+使用方法
pip安装termcolor失败解决方法+使用方法
358 0
|
Java
编译OpenJDK12:运行提示缺少freetype
编译OpenJDK12:运行提示缺少freetype
79 0
|
iOS开发
CMake教程7:安装与编译
CMake教程7:安装与编译
352 0
|
测试技术
CMake实战四:安装测试和添加环境生成安装包
CMake 也可以指定安装规则,以及添加测试。这两个功能分别可以通过在产生 Makefile 后使用 make install 和 make test 来执行。在 GNU Makefile 里,你可能需要为此编写 install 和 test 两个伪目标和相应的规则,但在 CMake 里,这样的工作同样只需要简单的调用几条命令。
371 0
|
Unix Linux C语言
cmake使用方法详解
cmake 简介     CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。
4761 0
|
Shell 数据库 C语言