使用CMakelist编译C++项目--demo演示

单个源文件:
一、文件目录

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(变量名 值12 ...)

#取变量值
${变量名}

多个源文件项目:
文件目录:

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;
}

你可能感兴趣的:(C++学习,c++,windows,linux)