单个源文件:
一、文件目录
CMakeListExercise/
|- CMakeListExercise.h
|- CMakeListExercise.cpp
|- CMakeList.txt
此时CMakeList.txt应当这样编写:
CMakeList.txt
# 指定cmake的最低版本号
cmake_minimum_required(VERSION 3.17)
# 指定项目名称
project(CMakeListExercise)
# 添加可执行文件
add_executable(CMakeListExercise CMakeListExercise.cpp)
二、一些基本常量
PROJECT_SOURCE_DIR
这是源代码的目录。一般是项目的路径。例如:/home/Projects/CMakeListExercise
PROJECT_BINARY_DIR
这是构建之后CMake的输出路径,一般是:项目路径/build-debug。例如:/home/cheng/CLionProjects/CMakeListExercise/build-debug
三、一些基本命令
#设置变量
set(变量名 值1 值2 ...)
#取变量值
${变量名}
多个源文件项目:
文件目录:
CMakeListExercise/
|- Class1.h
|- Class1.cpp
|- Class2.h
|- Class2.cpp
|- main.cpp
|- CMakeList.txt
多个源文件时,其实和单个源文件很相似。只需要将每个.cpp文件全部添加到可执行文件即可。
# 指定cmake的最低版本号
cmake_minimum_required(VERSION 3.17)
# 指定项目名称
project(CMakeListExercise)
# 添加可执行文件
add_executable(CMakeListExercise main.cpp Class1.cpp Class2.cpp)
静态库与动态库:
静态库(windows:.lib,linux:.a)是生成可执行文件之前就加入进来的。它和编译生成的汇编文件(.o/.obj)一起参加链接,打包成为可执行文件。优点是构建出来的程序自带所有依赖,可移植性很高。缺点是程序比较大,可能出现内存同时存在多份静态库的拷贝的情况。
动态库(windows:.dll,linux:.so)是在生成可执行文件之后才加入的。它不参加程序的链接过程。优点是可以减轻程序大小,节省内存空间。缺点是容易缺失(windows下安装软件缺各种dll的痛,大家都懂)
将项目编译成库
假设我们设计一个Animal库,里面有一只小猫,构造时会miao~
一个规范的项目工程目录形式如下:
Animal/
|- test/
|- include/
|- Animal.h
|- src/
|- Animal.cpp
|- CMakeList.txt
|- lib/
|- build/
include目录放置头文件,src目录下放置的是.c/.cpp源文件,build目录是用来构建的项目,lib目录用来放置我们生成库文件。
此时CMakeList.txt应当这样编写:
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
PROJECT(ANIMAL)
# 收集所有.cpp文件,赋值给变量SRC_LIST_CPP
FILE(GLOB SRC_LIST_CPP ${PROJECT_SOURCE_DIR}/src/*.cpp)
# 指定头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/include)
# 指定生成库文件存放的目录
SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 生成静态库
ADD_LIBRARY(animal ${SRC_LIST_CPP})
执行编译后,将在/ProjectName/lib下生成静态库文件libanimal.a
如果使用命令ADD_LIBRARY(animal SHARED ${SRC_LIST_CPP}),将会生成动态库。在/ProjectName/lib下生成动态库文件libanimal.so
使用库文件:
假设我们现在有一个项目UseAnimal,需要刚才做好的库。项目结构如下:
UseAnimal
|- Animal/
|- test/
|- include/
|- Animal.h
|- src/
|- Animal.cpp
|- CMakeList.txt
|- lib/
|- libanimal.a
|- libanimal.so
|- build/
|- CMakeList.txt
|- UseAnimal.cpp
此时CMakeList.txt应当这样编写:
CMAKE_MINIMUM_REQUIRED(VERSION 3.14)
PROJECT(UseAnimal)
# 指定链接库文件目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/Animal/lib)
# 先将UseAnimal.cpp生成可执行文件UseAnimal
ADD_EXECUTABLE(UseAnimal UseAnimal.cpp)
# 然后链接好库
TARGET_LINK_LIBRARIES(UseAnimal libanimal.so) # 或者使用静态库libanimal.a
源文件中仅需要#include库的头文件即可使用 UseAnimal.cpp
#include "Animal/include/Animal.h"
int main() {
Animal *a = new Animal();
delete a;
return 0;
}