前言
本文介绍了一些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 update
和sudo 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问题 我会继续补充。
如果你有任何问题或建议,欢迎在评论区留言。谢谢你的阅读和支持。