侧边栏壁纸
博主头像
Into The Abyss 博主等级

My Life is a Death Race

  • 累计撰写 34 篇文章
  • 累计创建 7 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

cmake学习

Administrator
2023-11-17 / 0 评论 / 0 点赞 / 316 阅读 / 0 字

这个东西不用学,用一用就会了

文件夹目录结构

├── build
├── CMakeLists.txt
├── includes
│   ├── a.h
│   └── b.h
├── lib
├── main.cpp
├── Makefile  
└── src
    ├── a.cpp
    └── b.cpp
//a.h
#ifndef _A_H
#define _A_H

int add(const int a, const int b);
 
#endif // !_A_H

//a.cpp
#include "a.h"

int add(const int a, const int b) {
    return a + b;
}


//b.h
#ifndef _B_H
#define _B_H

int sub(const int x, const int y);
 
#endif // !_B_H

// b.cpp
#include "b.h"

int sub(int x, int y){
    return x - y;
}

基础用法

常规

cmake_minimum_required(VERSION 3.0.0)  # 设置最小支持版本
project(template VERSION 0.1.0 LANGUAGES C CXX) # 项目命名

添加子文件夹add_subdirectory(),添加的文件夹必须包含一个CMakeLists.txt文件。这个文件描述了被包含目录的构建过程,包括编译选项、依赖项和生成的目标等信息。

添加头文件路径include_directories()函数允许将特定目录添加到CMake项目的头文件搜索路径中。参数为库文件夹,如include_directories(include)

生成可执行文件或库文件:add_executable()用于定义要构建的可执行文件,接受一个参数,即目标文件的名称,后面跟着源文件列表;add_library()用于定义要构建的库文件(静态库或共享库)。add_library(target_name STATIC/SHARED source1.cpp source2.cpp ...),其中STATIC/SHARED是库文件的类型,静态库或共享库(可选,默认是静态库)。

链接库文件target_link_libraries()函数用于指定一个目标文件(可执行文件或库文件)所依赖的其他库文件。它将这些库文件链接到目标文件,使得在构建过程中能够正确地链接所需的库。用法如

target_link_libraries(my_program my_library pthread),将my_programmy_librarypthread库链接起来,确保在构建my_program时能够正确地链接所需的库文件。

指定目标文件搜索目录target_include_directories()函数用于指定一个目标文件(可执行文件或库文件)的包含文件目录,即告诉编译器在哪里搜索头文件。这个函数允许您将特定目录添加到项目的头文件搜索路径中。用法如

target_include_directories(target_name PUBLIC/PRIVATE/INTERFACE directory1 directory2 ...)

target_name:要设置包含文件目录的目标文件(可执行文件或库文件)的名称。

PUBLIC/PRIVATE/INTERFACE:这些关键字用于指定该目录是否会传递给目标文件的依赖项。具体作用如下:

  • PUBLIC:这个目录将传递给依赖于该目标文件的目标文件。
  • PRIVATE:这个目录仅在当前目标文件中可用。
  • INTERFACE:这个目录仅传递给依赖于该目标文件的其他目标文件,而不会传递给当前目标文件。

查找并加载特定软件包find_package()函数是CMake中用于在系统中查找并加载特定软件包的功能。它允许CMake在系统中搜索预定义的模块,以找到所需的软件包,并配置项目以使用这些软件包提供的功能。

find_package(package_name [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [COMPONENTS component1 component2 ...])

  • package_name:要查找的软件包的名称,比如BoostOpenGL等。
  • version:可选项,指定所需的软件包版本。
  • EXACT:可选项,要求找到的软件包版本必须与指定版本完全匹配。
  • QUIET:可选项,当软件包未找到时,不输出查找失败的信息。
  • MODULE:可选项,指定要查找的模块名称。
  • REQUIRED:可选项,要求找到指定的软件包,如果未找到则停止CMake过程。
  • COMPONENTS:可选项,指定软件包的特定组件(例如,对于某些软件包,它们可能有多个功能组件)。

变量

CMAKE_CXX_STANDARD:这个变量用于指定所使用的 C++ 标准版本。set(CMAKE_CXX_STANDARD 11)

CMAKE_CXX_STANDARD_REQUIRED:这个设置表示是否要求编译器强制遵循 CMAKE_CXX_STANDARD 所指定的 C++ 标准。将其设置为 True 表示如果编译器不支持指定的 C++ 标准,CMake 将会产生一个错误并终止构建过程。如果将其设置为 False,CMake 会尝试使用可用的最接近指定标准的版本进行编译。

CMAKE_ARCHIVE_OUTPUT_DIRECTORY:设置静态库输出目录

CMAKE_LIBRARY_OUTPUT_DIRECTORY:设置动态库输出目录

CMAKE_RUNTIME_OUTPUT_DIRECTORY:设置可执行文件输出目录

CMAKE_CXX_FLAGSCMAKE_C_FLAGS:这些变量用于设置 C++ 和 C 编译器的编译选项。您可以使用这些变量来添加编译选项,例如优化标志、警告标志等。

CMAKE_BUILD_TYPE:用于指定构建类型,如 Debug、Release、RelWithDebInfo、MinSizeRel 等。不同的构建类型会启用不同的编译选项,例如 Debug 模式会启用调试信息,而 Release 模式则会启用优化。

CMAKE_INSTALL_PREFIX:用于指定安装目录,在运行 make install 时,生成的文件会被复制到这个目录下。默认情况下,/usr/local 是常用的安装目录。

CMAKE_PREFIX_PATH:用于指定搜索 CMake 包的路径。这对于寻找依赖项的位置很有用,比如寻找库文件、头文件和其他依赖项。

CMAKE_MODULE_PATH:指定 CMake 模块的搜索路径。CMake 模块通常用于提供额外的功能或设置,例如查找依赖项的 FindXXX.cmake 脚本。

PROJECT_SOURCE_DIRPROJECT_BINARY_DIR:分别表示项目的源代码目录和构建目录。PROJECT_SOURCE_DIR 指向 CMakeLists.txt 文件所在的目录,而 PROJECT_BINARY_DIR 则是 CMake 所使用的构建目录。

CMAKE_SYSTEM_NAME:指定操作系统的名称。

CMAKE_SYSTEM_VERSION:指定操作系统的版本。

CMAKE_SYSTEM_PROCESSOR:指定处理器的名称。

CMAKE_SIZEOF_VOID_P:指定指针的大小(以字节为单位)。

CMAKE_C_COMPILERCMAKE_CXX_COMPILER:指定 C 和 C++ 编译器的名称。

CMAKE_LINKER:指定链接器的名称。

CMAKE_ARCMAKE_RANLIB:指定静态库工具的名称。

CMAKE_MAKE_PROGRAM:指定用于构建的 make 工具的名称。

示例

静态库

生成静态库

cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ../lib)  # 设置静态库位置为lib文件夹
include_directories(includes)  # 添加头文件搜索路径
add_library(a ./src/a.cpp)

执行完毕后,目录结构为

├── build
│   ├── ...
├── CMakeLists.txt
├── includes
│   ├── a.h
│   └── b.h
├── lib
│   └── liba.a
├── main.cpp
├── Makefile
└── src
    ├── a.cpp
    └── b.cpp

在main.cpp中使用静态库

#include <iostream>
#include "a.h"

int main(int argc, char const *argv[])
{
    std::cout << add(5,5) << std::endl;
    return 0;
}

在cmake中链接到静态库,只是为了演示cmake的用法,在实际生产中不能先用cmake生成一个静态库,在改cmake来链接生成可执行文件

cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
include_directories(includes)
link_libraries(/home/pjw6/documents/project/yan/template/lib/liba.a) # 链接到静态库,必须为绝对路径
add_executable(main main.cpp)  # 生成可执行文件
# ./main输出为10

#或者
cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
include_directories(includes)
add_executable(main main.cpp)
target_link_libraries(main /home/pjw6/documents/project/yan/template/lib/liba.a) # 同样需要绝对路径

#或者
cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
include_directories(includes)
link_directories(/home/pjw6/documents/project/yan/template/lib/)
add_executable(main main.cpp)
target_link_libraries(main liba.a)

动态库

生成动态库

cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ../lib)
include_directories(includes)
add_library(b SHARED src/b.cpp)

修改main.cpp

#include <iostream>
#include "a.h"
#include "b.h"

int main(int argc, char const *argv[])
{
    std::cout << add(5,5) << std::endl;
    std::cout << sub(10,5) << std::endl;
    return 0;
}

使用动态库

cmake_minimum_required(VERSION 3.0.0) 
project(template VERSION 0.1.0 LANGUAGES C CXX)
include_directories(includes)
link_directories(/home/pjw6/documents/project/yan/template/lib/)
add_executable(main main.cpp)
target_link_libraries(main b a)
0

评论区