4、cmake使用案例(Linux下)
1、cmake介绍
CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。只是 CMake 的组态档取名为 CMakeLists.txt。
2、不同情况下使用cmake
(1)demo1(单目录单文件),在test目录下有main.cpp源文件
1) main.cpp

#include <stdio.h> #include <stdlib.h> int sub(int a, int b) { return a+b; } int main(int argc, char *argv[]) { if (argc < 3){ printf("Usage: %s base exponent \n", argv[0]); return 1; } int a = atoi(argv[1]); int b= atoi(argv[2]); int result = sub(a, b); printf("%d + %d = %d\n", a, b, result); return 0; }
2)编写 CMakeLists.txt,并保存在与 main.c 源文件同个目录下:
CMakeLists.txt:
#CMake 最低版本号要求 CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1) #指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言 PROJECT(demo1) #生成可执行文件 ADD_EXECUTABLE(demo1 main.cpp)
3)然后在test目录下执行cmake ./ 就会生成Makefile文件
4)然后再执行make,就会生成可执行程序
5)运行可执行程序
(2)demo2(单目录多文件),在test目录下有main.cpp、mymath.cpp、mymath.h源文件
main.cpp

#include <stdio.h> #include <stdlib.h> #include "mymath.h" int main(int argc, char *argv[]) { if (argc < 3){ printf("Usage: %s base exponent \n", argv[0]); return 1; } int a = atoi(argv[1]); int b= atoi(argv[2]); int result = sub(a, b); printf("%d + %d = %d\n", a, b, result); return 0; }
mymath.h

#ifndef _MY_MATH_H_ #define _MY_MATH_H_ int sub(int a, int b); #endif
mymath.cpp

#include "mymath.h" int sub(int a, int b) { return a+b; }
此时编写的CMakeLists如下:
#CMake 最低版本号要求 CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1) #指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言 PROJECT(demo2) #把一个目录下所有的源代码文件并将列表存储在一个变量中 AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #生成可执行文件 ADD_EXECUTABLE(demo2 ${DIR_SRCS})
(3)demo3(多目录多文件)
目录结构如下:
源文件修改的地方:(1)main.cpp的头文件引用#include "mymath.h"改为#include "./mylib/mymath.h"
此时mylib目录下的CMakeLists.txt:
#把一个目录下所有的源代码文件并将列表存储在一个变量中 AUX_SOURCE_DIRECTORY(./ DIR_LIB_SRCS) #生成动态库或静态库 ADD_LIBRARY(Mylib STATIC ${DIR_SRCS})
test目录下的CMakeLists.txt:
#CMake 最低版本号要求 CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1) #指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言 PROJECT(demo3) #向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置 ADD_SUBDIRECTORY(./mylib) #把一个目录下所有的源代码文件并将列表存储在一个变量中 AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #生成可执行文件 ADD_EXECUTABLE(demo3 ${DIR_SRCS}) #为target添加需要链接的共享库 TARGET_LINK_LIBRARIES(demo3 Mylib)
(4)demo4,把demo3改为标准的工程
目录结构如下:
此时mylib中CMakeLists.txt:
#把一个目录下所有的源代码文件并将列表存储在一个变量中 AUX_SOURCE_DIRECTORY(./ DIR_LIB_SRCS) #设置生成的库的目录,PROJECT_BINARY_DIR为build目录 SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib) #生成动态库或静态库 ADD_LIBRARY(Mylib STATIC ${DIR_LIB_SRCS})
此时src中CMakeLists.txt:
#向工程添加多个特定的头文件搜索路径 INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/mylib) #设置生成可执行程序的目录,PROJECT_BINARY_DIR为build目录 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #把一个目录下所有的源代码文件并将列表存储在一个变量中 AUX_SOURCE_DIRECTORY(./ DIR_SRCS) #生成可执行文件 ADD_EXECUTABLE(demo4 ${DIR_SRCS}) #为target添加需要链接的共享库 TARGET_LINK_LIBRARIES(demo4 Mylib)
最外层目录(test目录)中CMakeLists.txt:
#CMake 最低版本号要求 CMAKE_MINIMUM_REQUIRED(VERSION 3.5.1) #指定工程名称,并可指定工程支持的语言。支持语言列表可忽略,默认支持所有语言 PROJECT(demo4) #向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置 ADD_SUBDIRECTORY(./mylib) #向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制的存放位置 ADD_SUBDIRECTORY(./src)