这个东西不用学,用一用就会了
文件夹目录结构
├── 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_program
与my_library
和pthread
库链接起来,确保在构建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
:要查找的软件包的名称,比如Boost
、OpenGL
等。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_FLAGS
和 CMAKE_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_DIR
和 PROJECT_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_COMPILER
和 CMAKE_CXX_COMPILER
:指定 C 和 C++ 编译器的名称。
CMAKE_LINKER
:指定链接器的名称。
CMAKE_AR
和 CMAKE_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)
评论区