11下的初体验
Cmake新手使用日记(1卡塔 尔(英语:State of Qatar)【C++11下的初体验】,cmake11下
第贰回使用Cmake,寻找了无数施用教程,饱含《Cmake实践》、《Cmake手册》等,可是在针对最新的C++11尺度下编制程序照旧会设有一小点标题,要求尝试很多次错误并寻找大批量稿子手艺消弭难题。这里用生手日记的方法告知一个Cmake小白怎么样在C++11下行使Cmake。
经常景况下,直接阅读文书档案会不太适应新手,未有感官的认知,未有经验。这里将和煦的学习进程记录下来,方便温馨查阅,也利于别的生手学习。
意气风发、单文件编写翻译
(1卡塔尔操作进程
<1>创制一个目录t1.
<2>编写代码:
main.cpp
1 #include <iostream>
2 #include <vector>
3 int main()
4 {
5
6 using namespace std;
7 vector<int> V(5,3);
8 for(auto e:V)
9 cout << e << endl;
10 cout << "OK" << endl;
11 return 0;
12
13 }
<3>编写CMakeLists.txt
【注意】不忘记记“CMakeLists.txt”中“.”前还会有一个“s”,假如您很马虎,推断会在此边无可如何。
PROJECT (HELLO)
SET(CMAKE_C_COMPILER g++)
if(CMAKE_COMPILER_IS_GNUCXX)
add_compile_options(-std=c++11)
endif(CMAKE_COMPILER_IS_GNUCXX)
SET(SRC_LIST main.cpp)
ADD_EXECUTABLE(hello ${SRC_LIST})
<4>在t1文件夹下编写翻译
先运行
Cmake .
再运行
make
<5>运路程序
那时,再t1文件夹下会发生hello文件,运营
./hello
次第就不错运维啦。
输出
@ubuntu:~/t1$ ./hello
3
3
3
3
3
OK
(2卡塔尔进程解释
首先,在CMakeLists.txt中,命令能够动用大写、小写、混写。
PROJECT (HELLO)是CMakeLists.txt的首先句,告诉编写翻译器那一个工程称为hello。
SET(CMAKE_C_COMPILEEscortg++)证明使用g++编写翻译器,因为只假诺.c文件的话常常选择暗中认可的gcc编写翻译器。
add_compile_options(-std=c++11)告诉编写翻译器使用的是c++11,不过如若不安装g++编写翻译器,又不决断一下编写翻译器的话会产出上边包车型地铁运作结果:
@ubuntu:~/t1$ make
Scanning dependencies of target hello
[ 50%] Building CXX object CMakeFiles/hello.dir/main.o
c++: error: unrecognized command line option ‘-std=C++11’
CMakeFiles/hello.dir/build.make:62: recipe for target 'CMakeFiles/hello.dir/main.o' failed
make[2]: *** [CMakeFiles/hello.dir/main.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/hello.dir/all' failed
make[1]: *** [CMakeFiles/hello.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2
有的博客里说能够编写翻译完毕,不过在那间一时候就完不成。当然不时候也能完结,这些只怕和实际的系统有关呢。
当现身上述难点时,能够利用安装编写翻译器的点子解决,也得以接受if语句进行决断,这里为了能够将具有景况都讲驾驭,就一时画蛇添足这些写了。当中CMAKE_COMPILER_IS_GNUCXX用于判别编译器类型。
可是作者也遇上那样的主题素材,借使不安装编写翻译器为g++,第4回设置编写翻译器为std=c++11属性时报错,不过只要设置达成功运营之后,就算吧编写翻译器设置的语句去掉,把t1上面除了main.cpp和CMakeLists.txt之外的语句去掉,也能健康编写翻译。真的有些意想不到。
接着SET(SRC_LIST main.cpp) 和ADD_EXECUTABLE(hello ${SRC_LIST}) 语句。定义了这么些工程会转移叁个文本名称为 hello 的可推行文件,相关的源文件是 SRC_LIST 中 定义的源文件列表, 本例中也能够一贯写成 ADD_EXECUTABLE(hello main.c)。
${}来援用变量,那是 cmake 的变量应用措施,不过,有风流倜傥部分两样,比 如在 IF 调整语句,变量是直接行使变量名引用(如这里的CMAKE_COMPILER_IS_GNUCXX卡塔 尔(阿拉伯语:قطر,而无需${}。如若采取了${}去选拔变量,其实 IF 会去判断名叫${}所代表的值的变量,那当然是空中楼阁的了。
(3卡塔尔一点只顾
在CMakeLists.txt脚本中,设置编译选项能够透过add_compile_options
一声令下,也足以通过set命令纠正CMAKE_CXX_FLAGS
或CMAKE_C_FLAGS
。
使用那二种方法在部分情况下效果是相像的,但请小心它们照旧有分别的:
add_compile_options
指令增添的编写翻译选项是指向富有编写翻译器的(包涵c和c++编写翻译器),而set命令设置CMAKE_C_FLAGS
或CMAKE_CXX_FLAGS
变量则是个别只针对c和c++编译器的。因而,下边包车型地铁代码也是如出大器晚成辙的成效哦!
PROJECT (HELLO)
SET(CMAKE_C_COMPILER g++)
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
endif(CMAKE_COMPILER_IS_GNUCXX)
SET(SRC_LIST main.cpp)
ADD_EXECUTABLE(hello ${SRC_LIST})
第四回选择Cmake,找出了无数选择教程,富含《Cmake施行》、《Cmake手册》等,可是在针...