其实,每次碰到要安装一些软件啊,通常软件的源码都是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