让cmake显示gcc/g++的编译信息

项目目录结构

第一个项目,肯定是大家都懂的“hello world”了。那就先来看一下这个“庞大”的项目结构吧。

哈哈,其实就只有一个代码文件 main.c。源码内容嘛,程序员都知道。

至于CMakeLists.txt嘛,那当然就是今天的主角了。换句话说,以前的Makefile(makefile)已经被CMakeLists.txt取代了。稍后再重点介绍。

还有一个空文件夹build,干嘛用的呢。它就相当于一个垃圾桶,我们实用cmake的外部构建的方式的时候,编译过程中产生的一些中间文件,比如.o文件,cmake本身的中间文件等等都会放到build里面。而我们的源码目录干干净净,是不是很适合有代码洁癖的你呢。

 

   撸起袖子写cmake

按照以前,我就得去找其他项目的Makefile过来改,然后凑合的用了。可现在,我可以“骄傲”的说,我可以白手起家搞定CMakeLists.txt。一起见证奇迹!

哈哈,就是这么简单。就3行cmake语法。其实前面2行可以不写,你只写一行就可以了。既然写了,就稍微解释一下语法吧(太深入,我也不懂)。

     PROJECT(projectname [CXX] [C] [JAVA])

用于指定工程名字,[]为可选内容,默认表示支持所有语言。注意这条指令还隐式定义了另外两个变量<projectName>_BINARY_DIR 和<projectName>_SOURCE_DIR。我们这里的project定义为了hello,所以这两个变量就是${hello_BINARY_DIR} 和 ${hello_SOURCE_DIR}。什么意思呢,可以用message命令打印出来看看他的值。

${hello_BINARY_DIR} :就是cmake要(构建)编译我们的项目(main.c)的具体路径。这里当然就是build。

${hello_SOURCE_DIR} :就是我们项目的源码的具体路径,这里当然是项目的根目录。

如果采用的是内部构建的方式,即直接在项目根目录下运行cmake,那这两个变量的值是一样的。不过一般很少使用这两个变量。大家都比较喜欢用 ${CMAKE_SOURCE_DIR} 和 ${CMAKE_BINARY_DIR}.

    cmake_minimum_required

这个就比较好理解了,就是这个项目要求的cmake版本不能低于2.8版本。当使用新版本的cmake才有的特性的时候,就需要加上这个了。

 

   add_executable

顾名思义,就是要生成一个可执行程序hello呗。注意这里的hello和project里面的hello是没有关系的。这里的hello,是说最终编译出来的二进制文件名字叫hello。你可以改成你喜欢的名字。那hello当然是通过main.c来编译的了。如果有多个.c文件,一并在后面加入就行。但是如果你深入学习了cmake,其实是不用一个一个手工写.c文件的。这里只有一个main.c就无所谓了。

 

加上message打印cmake调试信息后的cmake如下:

 

 愉快的编译项目吧

运行cmake的方式就是 :

cmake CMakeLists.txt所在的路径

 

我们采用外部构建的方式。到build文件夹里面(cd build)

哈哈,太好了。cmake帮我生成了Makefile。而代码外面还是非常干净的,就一个mian.c。通过message打印出来的信息看,果然验证了上面的解释。

那接下来就可以开心的make了

 

    让make更透明些

make顺利的执行成功了,也得到了我们期待的“hello world”。但是make的信息太简单了,感觉空落落的。以前的Makefile可都是打印出gcc 等详细编译过程的哦。

不要担心,make的时候加个参数就行了。

make VERBOSE=1

这样你就可以在编译信息里面看到你想要的详细的gcc/g++的编译参数了。比如:

[100%] Building C object CMakeFiles/hello.dir/main.c.o
/usr/bin/cc -o CMakeFiles/hello.dir/main.c.o -c /home/study/program/cmake/hello/main.c
Linking C executable hello

 

什么,要在make的时候写参数。太不友好了。cmake知道你懒,所以也帮你搞定了。在CMakeLists.txt里面加上这句指令就可以了。

set(CMAKE_VERBOSE_MAKEFILE ON)

 

真爽,睡觉~~

猜你喜欢

转载自blog.csdn.net/Tommy_wxie/article/details/77675895