Cmake的使用 (一)

如果不想用IDE构建项目,cmake和qmake是最好构建项目工具,接下来我会通过一系列的练习和大家一起学习cmake
Test 1:
一般项目分为内部构建和外部构建,内部构建会将构建中间文件放在项目中,这使得我们重新构建时,清理中间文件非常麻烦,外部构建是将中间文件存放在特定目录中,使得中间文件不与项目文件弄混,且一般便于清理,第一个练习我采用内部构建的方式,来熟悉cmake的语法
首先创建我们的项目目录(proj1)直接在里面编写main.c

#include <stdio.h>
int main(int argc,char** argv) {
    printf("Hello Cmake");
    return 0;
}

然后在该目录下编写CMakeLists.txt(文件名必须是这个)

PROJECT (HELLO)     #定义工程名称
SET(SRC_LIST main.c)    #SET命令用来显式定义变量#这里设置添加源文件main.c
#MESSAGE命令主要是向终端用户输出有用信息
#通过PROJECT命令指定工程名称(projectname)后会自动生成projectname_BINARY_DIR
#projectname_SOURCE_DIR变量分别用来表示二进制存放目录和源文件存在目录
#不过为了防止以后工程名称可能修改用PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR代替
#projectname_BINARY_DIR和projectname_SOURCE_DIR才是明智的选择
MESSAGE(STATUS "This is Binary dir " ${HELLO_BINARY_DIR}) #Fixme by use PROJECT_BINARY_DIR
MESSAGE(STATUS "This is Source dir " ${HELLO_SOURCE_DIR}) #Fixme by use PROJECT_SOURCE_DIR
ADD_EXECUTABLE(hello ${SRC_LIST})	#定义工程生成hello可执行文件通过源文件${SRC_LIST}

各指令功能已在注释中给出
然后通过(cmake 项目目录路径) 如果没有报错且正确生成Makefile的话在项目目录下执行make就能编译整个项目了

Test 2:
上个练习学习了内部编译,也比较了内部编译和外部编译,接下来我们通过外部编译来练习上个例子
首先我们创建项目目录proj2,进入项目目录编写个简单正确的main.c
编写CMakeLists.txt

#Example for 外部编译
project (Marco)
SET (SRC_LIST "main.c")
MESSAGE (STATUS "This is Binary Dir " ${PROJECT_BINARY_DIR})
MESSAGE (STATUS "This is Source Dir " ${PROJECT_SOURCE_DIR})
ADD_EXECUTABLE (marco ${SRC_LIST})

然后在项目目录下或者其他地方创建build(名称随意)目录,进入该目录执行
cmake 项目目录路径就会在build目录生成cmake中间文件,达到与项目文件的分离,然后执行make就会编译项目生成可执行文件

Test 3
这里做个更符合项目生产的练习,用过像vs,qt creater等这些IDE的都知道,源文件一般都集中放在项目目录下src中目录,还有header,res等目录,所有这里我们继续采用外部构建的方式针对源文件存放一个或多个子目录中情况,这里我们将学习
ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]命令
这个指令用于指定向工程添加存放源文件的 子目录并可以指定binary_dir用于存放中间二进制文件和目标二进制文件EXCLUDE_FROM_ALL用于排除用于构建工程的目录
我们在src下编写正确的main,c和CMakeLists.txt

#for project subdir src
ADD_EXECUTABLE(hello "main.c")

//指定通过源文件main,c生成名为hello的可执行文件
在项目目录下编写CMakeLists.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

用于指定项目名称和添加子目录src为源文件目录,并指定二进制存放于构建目录下的bin(如果没有自动生成)
自此就可以执行cmake和make的操作

猜你喜欢

转载自blog.csdn.net/rgbmarco/article/details/80228347