一、makefile、CMakeLists.txt

  1. makefile
    makefile是在Linux编译c或者c++代码的时候的一种脚本文件,但是每一个功能都要写一个makefile文件,这样如果这个工程很大,而且相关性比较强的话,makefile的书写就会变得相对繁琐,更要命的是如果以后需要添加新的功能或者是新人需要修改功能的话,看起来就会特别麻烦;
  2. CMakeLists.txt
    cmake的所有语句都写在一个CMakeLists.txt的文件中,CMakeLists.txt文件确定后,直接使用cmake命令进行运行,但是这个命令要指向CMakeLists.txt所在的目录,cmake之后就会产生我们想要的makefile文件,然后再直接make就可以编译出我们需要的结果了。

更简单的解释就是cmake是为了生成makefile而存在,这样我们就不需要再去写makefile了,只需要写简单的CMakeLists.txt即可。

二、一个单文件的简单的例子

文件名字为main.c 内容如下:

#include <stdio.h>
int main()
{
printf("Hello World Test!\n");
return 0;
}

CMakeLists.txt文件内容如下:

project(hello_jelly)
set(APP_SRC main.c)
add_executable(${PROJECT_NAME} main.c)

#print message
message(${PROJECT_SOURCE_DIR})

解释代码:

第一个行project不是强制性的,最好加上,这会引入两个变量:

HELLO_BINARY_DIR, HELLO_SOURCE_DIR

同时也会定义两个等价的变量:

PROJECT_BINARY_DIR, PROJECT_SOURCE_DIR

外部编译要时刻区分这两个变量对应的目录

可以通过message进行输出

message(${PROJECT_SOURCE_DIR})

set 命令用来设置变量

add_exectuable 告诉工程生成一个可执行文件。

add_library 则告诉生成一个库文件。

CMakeList.txt 文件中,命令名字是不区分大小写的,而参数和变量是大小写相关的。

然后将以上两个文件放在统一目录下面,注意编译产生时候分为两种,

  • 一种是直接在当前源码目录执行cmake命令#cmake ./,但是这样会在当前目录下产生很多临时文件和目录,
  • 另一种方式就是在当前目录新建一个build目录,然后我门进入到build目录,执行命令cmake
    …/,这样产生的所有临时文件都会生成在build目录下,而不影响源码目录的代码,

此处我们采用第二种方法。

我们进入到build目录,执行命令

# cmake ../

然后在当前目录可以看到文件如下

drwxrwxr-x 3 zqq zqq 4096 9  28 17:12 CMakeFiles
-rw-rw-r-- 1 zqq zqq 993 9 28 17:12 cmake_install.cmake
-rw-rw-r-- 1 zqq zqq 5479 9 28 17:12 Makefile

最后再在此目录执行make即可生成相应的可执行程序。