1、CMake教程之 Hello world
1.1编写CMakeLists.txt
最基本的CMake项目是从单个源代码文件构建的可执行文件。对于这样的简单项目,只需要一个包含三个命令的CMakeLists.txt文件。
注意:虽然CMake支持大写,小写和混合大小写命令,但小写命令是首选,并将在整个教程中使用。
任何项目的最重要的CMakeLists.txt必须从使用cmake_minimum_required()命令指定最小CMake版本开始。这将建立策略设置,并确保以下CMake函数与CMake的兼容版本一起运行。
要启动一个项目,我们使用project()命令来设置项目名称。这个调用对于每个项目都是必需的,应该在cmake_minimum_required()之后不久调用。正如我们稍后将看到的,该命令还可以用于指定其他项目级别的信息,如语言或版本号。
最后,add_executable()命令告诉CMake使用指定的源代码文件创建一个可执行文件。
//指定最小CMake版本开始
cmake_minimum_required(VERSION 3.10)
//设置项目名称
project(HelloWorld)
//告诉CMake使用指定的源代码文件创建一个可执行文件
add_executable(HelloWorld helloworld.cpp)
1.2执行命令
//以下两个命令的主要工作是保证cmake编译生成的工程在 build_linux 下
mkdir build_linux
cd build_linux
cmake ..
//make是linux下才使用,windows下会生成vs工程
make
2、CMake教程之 函数详解及使用
2.1 add_executable
//创建一个可执行程序
add_executable(<target> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
参数说明:
target:要创建的可执行目标的名称。
[WIN32]:可选参数,在 Windows 平台上生成一个窗口应用程序,隐藏控制台窗口。
[MACOSX_BUNDLE]:可选参数,在 macOS 上生成一个应用程序包(Bundle)。
[EXCLUDE_FROM_ALL]:可选参数,将该目标从默认构建中排除。
source1 [source2 …]:源代码文件的列表,用于构建可执行目标。
2.2 add_library
//创建一个库
add_library(<target> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...])
参数说明:
target:要创建的库目标的名称。
[STATIC | SHARED | MODULE]:可选参数,指定库的类型。静态库(STATIC),共享库/动态库(SHARED),或模块库(MODULE)。
[EXCLUDE_FROM_ALL]:可选参数,将该目标从默认构建中排除。
source1 [source2 …]:源代码文件的列表,用于构建库目标。
2.3 target_include_directories
//用于向目标(可执行目标、库目标)添加包含目录。
target_include_directories(<target> [SYSTEM] [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
参数说明:
target:要添加包含目录的目标。
[SYSTEM]:可选参数,将目录视为系统级别的目录,对于一些系统头文件的搜索一般使用该选项。
[BEFORE]:可选参数,将目录添加到已存在的包含目录之前。
<INTERFACE | PUBLIC | PRIVATE>:指定目标的属性类型,这决定了包含目录是否会传播给依赖的目标。
[items1…]:包含目录路径的列表。
[<INTERFACE|PUBLIC|PRIVATE> [items2…] …]:可以指定多个属性类型和对应的包含目录。
2.4 target_link_libraries
//命令用于将链接目标(可执行目标、库目标)与其他库目标进行关联,以创建构建的依赖关系
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)
参数说明:
target:要链接的目标(例如可执行目标、库目标)。
<PRIVATE | PUBLIC | INTERFACE>:指定链接的属性类型,决定链接的库的可见性和传递性。
item …:要链接的库目标或其他库的名称。
属性类型说明:
PRIVATE:链接库作为私有依赖项添加到目标,不会传递给依赖此目标的其他目标。
PUBLIC:链接库作为公共依赖项添加到目标,传递给依赖此目标的其他目标。
INTERFACE:链接库作为接口依赖项添加到目标,不会链接到目标本身,但会传递给依赖此目标的其他目标。
2.5 target_sources
//用于向指定目标(如可执行目标或库目标)添加源文件
target_sources(<target> [PRIVATE|PUBLIC|INTERFACE] [items1...]
[<PRIVATE|PUBLIC|INTERFACE> [items2...] ...])
参数说明:
target:要向其添加源文件的目标。
[PRIVATE | PUBLIC | INTERFACE]:可选参数,用于指定源文件的属性类型。默认为 PRIVATE。
[items1…] [items2…]:要添加的源文件列表。
2.6 target_link_options
//用于向目标(如可执行目标或库目标)添加链接选项
target_link_options(<target> [BEFORE]
[PRIVATE|PUBLIC|INTERFACE] <options>...)
参数说明:
target:要添加链接选项的目标。
[BEFORE]:可选参数,指定将链接选项添加到当前已存在的选项之前。
[PRIVATE | PUBLIC | INTERFACE]:可选参数,用于指定链接选项的属性类型。默认为 PRIVATE。
options…:要添加的链接选项列表。
2.7 target_compile_options
//用于向目标(如可执行目标或库目标)添加编译选项
target_compile_options(<target> [PRIVATE|PUBLIC|INTERFACE] <options>...)
参数说明:
target:要添加编译选项的目标。
[ PRIVATE | PUBLIC | INTERFACE ] :可选参数,用于指定编译选项的属性类型。默认为 PRIVATE。
options…:要添加的编译选项列表。
3、CMake教程之结尾案例
通过上述的CMake 常用的入门函数 详解,屏幕前 聪慧的你 已经能写出一个非常棒的案例。为了避免你遇到一些不必要的坑,我这边写了一个案例,希望能帮到你。
案例中有两个例子,一个是生成Log库,一个是生成CLog可执行程序, CLog中会调用Log。
地址:https://download.csdn.net/download/weixin_43842397/88792069