CMake error 合集(Configuring incomplete errors occurred!)

其实,每次碰到要安装一些软件啊,通常软件的源码都是c/c++,刚开始LZ不理解,从来都是跟着Readme.txt,一步步安装,如果说一帆风顺的把软件安装好了,也就罢了,很可能不会深究到底

cmake .
cmake ..
make all
make -j4
make install

上述列出来的到底是什么含义,直接机械式地先安装依赖库,经常用的也就是:

sudo apt-get install  #balala...一堆依赖库的名字

安装完依赖库,通常就会:

mkdir build
cd build
cmake ..
make
make install

简直是教科书般的标准流程,但是很多情况下,在camke这一块儿就会出错,LZ也是才接触这些,之前碰到很多的cmake错误东一个博客西一个博客一查,虽然问题解决了,但也没留下啥具体解决方案,或者报的错误是哪些,所以,LZ决定还是得新开一篇博客,把碰到的cmake错误汇总到一起。

哈哈,cmake的时候每次应该都最怕看见:

Configuring incomplete errors occurred!/(ㄒoㄒ)/~~**

1.Cannot find source file. SRC_LIST. Tried extensions .c .C .c++ …add_executable called with incorrect number of arguments

这个cmake找不到对应的的文件,LZ犯这个错误的原因是

#wrong one
add_executable(hello SRC_LIST)

#right one
add_executable(hello ${SRC_LIST})

这是为了输出一个可执行文件,第一行的代码是在找文件名为SRC_LIST的文件,但实际上,这是LZ定义的一个变量,在cmake中引用定义的变量是要加${SRC_LIST}这个符号的。

2.make: … empty variable name. stop.

不存在空的变量名称。停止。。。

这是因为输入的make后面的变量并没有定义好,LZ犯错的原因如下:

#wrong one
make VERBOSE = 1

#right one
make VERBOSE=1

小伙伴看出来哪里有不同的嘛?没错!等式左右LZ习惯性的打了空格,然后就光荣的报错了/(ㄒoㄒ)/~~

上面代码的意思是可以看到make构建的详细过程。

3.add_executable cannot create target “hello” because another target with the same name already exists. The existing target is an executable created in source directory

报错都是一长段,习惯就好,主要看具体报错的位置和错误类型,上面错误是LZ把两个可执行文件的文件名定义成一样的了,那是肯定得报错了,双胞胎还得有不同呢。。。

4.Parse error in command line argument -DCMAKE_INSTALL_PREFIX. Should be: VAR: type=value CMake Error: No cmake script provided. CMake Error: Problem processing arguments. Aborting

其实,这个错误是在定义安装目录的时候报错的,也就是使用-DCMAKE_INSTALL_PREFIX的时候出问题的,LZ把正确的和错误的还是都贴出来:

#wrong
cmake -DCMAKE_INSTALL_PREFIX = /tmp/t2/usr

#right
cmake -DCMAKE_INSTALL_PREFIX=/tmp/t2/usr

又是老问题,等式左右两边加了空格,这真的是写代码的习惯性问题,所以这种编译错误还是对于LZ来说会经常碰到。。。

5.CMake Warning(dev) in CMakeLists.txt: No cmake_minimum_required command is present. A line of code such as cmake_minimum_required(VERSION 2.8) should be added at the top of the file

这其实都不能算是个error,只是一个warning,如果在有些IDE当中,如果你没有定义cmake的最低版本,它会帮你自动添加这行代码的:

cmake_minimum_required(VERSION 2.8)

cmake对于命令的大小写不敏感,但是对于变量的大小写是敏感的。还有一个问题,就是注意一下自己安装的cmake的版本,不要设置的最低版本比你安装的版本还要高,那就直接没办法编译了。

怎么查看你的cmake版本?

#在终端中输入
cmake --version

#终端显示
cmake version 2.8.12.2

6.add_library cannot create target “hello” because another target with the same name already exists. The existing target is a shared library create in source directory

这是LZ在编译动态库和静态库出现的问题,如果直接把静态库和动态库直接使用相同的命名的话,就会报上述的错误。

#wrong
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello STATIC ${LIBHELLO_SRC})

#right(如果不要求静态库和动态库的名字相同的话)
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello_static STATIC ${LIBHELLO_SRC})

#right(如果需要两个库名字相同的话)
add_library(hello SHARED ${LIBHELLO_SRC})
add_library(hello STATIC ${LIBHELLO_SRC})
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hello")

7.CMAKE Error at lib/cmake_install.cmake:48(FILE): file INSTALL cannot copyfile, “source path” to “target path” Call stack(most recent call first):cmake_install.cmake:37(INCLUDE)

看到这个报错LZ还是会一脸懵逼的,因为只是报一个无法拷贝文件的问题,所以还是应该会想到是权限不够的问题,虽然有文章建议说安装软件的时候尽量不要用sudo但是,有些软件不用sudo根本没法安装,这其实还是蛮矛盾的存在,所以咯:

#报错的安装方法
make install

#解决方案
sudo make install 

如果报permiss denied感觉错误应该更好找。。。

8.Cannot specify link libraries for target “curltest” which is not built by the project

其实LZ犯这个错误也是很愚蠢的,LZ先写了target_link_libraries(curltest curl),然后定义的add_executable(curltest main.c),单纯的把顺序写反了,所以程序找不到curltest的定义。。。真是一点都不智能。还是没有养成写CMakeLists.txt的良好习惯。

9.Parse error.Function missing ending “)”. End of file reached

报的错误是解析错误,是因为圆括号不对称,导致直接程序找到文章结尾了,注意查找对应括号就行了。

其实还会遇到很多其它错误啦,只能遇到一个解决一个咯O(∩_∩)O

你可能感兴趣的:(cmake)