cmake和CMakeLists.txt的基础使用

141 阅读2分钟

CMake

CMake是一个跨平台的构建工具,用于管理项目的构建过程。它通过简化构建配置的过程,使得项目可以在不同的平台和编译器上进行构建,而无需手动编写复杂的构建脚本。下面是CMake的详细使用介绍:

  1. CMakeLists.txt文件: CMake项目的配置主要通过项目根目录下的CMakeLists.txt文件进行。这个文件描述了项目的组织结构、编译选项、依赖项等信息。

  2. 基本语法: CMake的语法采用命令和参数的形式,每个命令都以command(arguments)的形式出现。例如,add_executable(target_name source1.cpp source2.cpp)用于定义一个可执行文件。

  3. 常用命令

    • project(name): 定义项目的名称。
    • add_executable(target sources): 定义一个可执行文件,target为目标文件名,sources为源文件列表。
    • add_library(target sources): 定义一个库文件,target为目标库名,sources为源文件列表。
    • target_link_libraries(target libraries): 指定目标文件链接的库文件。
    • include_directories(directory): 添加头文件搜索路径。
    • link_directories(directory): 添加库文件搜索路径。
    • find_package(package): 查找并加载指定的外部包。
    • if(condition) ... elseif(condition) ... else() ... endif(): 条件语句。
    • foreach(item list) ... endforeach(): 循环语句。
    • set(variable value): 设置变量的值。
  4. 变量和宏: CMake中的变量可以使用set()命令来设置,使用${}语法来引用。除了普通变量外,还可以定义函数宏和字符串宏,以方便地重复使用代码块。

  5. 条件编译: 可以使用if()else()来根据条件进行编译选项的设置,例如根据不同平台或编译器类型选择性地添加特定的编译选项。

  6. 外部依赖管理: 使用find_package()命令可以在CMake中管理外部依赖项,例如查找并加载OpenGL、Boost等常用库。

  7. 构建项目: 在项目根目录下创建一个build文件夹,然后在该文件夹下执行cmake ..命令来生成构建文件(如Makefile或Visual Studio项目文件),最后执行构建命令(如make或Visual Studio的构建命令)来编译项目。

  8. 生成安装包: 可以使用CMake的install()命令来指定安装文件和目录,并通过make install或类似的命令将文件复制到指定的目标位置。

  9. 模块化设计: 可以将项目的各个部分分解为不同的CMake模块,然后通过include()命令将它们包含到主CMakeLists.txt文件中,以实现项目结构的模块化管理。

  10. 交叉编译: CMake支持交叉编译,可以通过设置交叉编译工具链文件或者手动指定交叉编译器的相关参数来配置交叉编译环境。

以上是CMake的基本使用介绍,它是一个功能强大、灵活且易于使用的构建工具,广泛应用于各种类型的项目中。

以下是一个简单的使用CMake构建C++项目的示例。

假设我们有如下的项目结构:

css
复制代码
project
│
├── CMakeLists.txt
├── src
│   ├── main.cpp
│   └── functions.cpp
└── include
    └── functions.h
  1. 首先,我们创建项目根目录下的CMakeLists.txt文件,内容如下:
cmake
复制代码
cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 添加头文件搜索路径
include_directories(include)

# 添加可执行文件
add_executable(my_executable src/main.cpp src/functions.cpp)
  1. 接下来,我们编写项目的源文件和头文件。假设我们有以下文件:

src/main.cpp

cpp
复制代码
#include <iostream>
#include "functions.h"

int main() {
    std::cout << "Hello, CMake!\n";
    int result = add(5, 3);
    std::cout << "5 + 3 = " << result << std::endl;
    return 0;
}

src/functions.cpp

cpp
复制代码
#include "functions.h"

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

include/functions.h

cpp
复制代码
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

int add(int a, int b);

#endif
  1. 最后,在项目的根目录下创建一个名为build的文件夹,然后在该文件夹下执行以下命令:
go
复制代码
cmake ..
make

这将生成构建文件(例如Makefile),然后执行构建命令编译项目。完成后,你会在build文件夹中找到生成的可执行文件my_executable,可以执行它来运行你的程序。

这就是一个简单的使用CMake构建C++项目的示例。你可以根据项目的实际需求修改CMakeLists.txt文件,并添加更多的源文件、库文件等。

CMakeLists.txt

在Android开发中,CMakeLists.txt文件用于定义项目的构建规则和配置,以便在使用CMake构建项目时生成相应的构建文件(如Makefile)和构建项目。下面是一个详细的Android CMakeLists.txt使用方式和一些常见规则:

  1. 项目设置

    cmake
    复制代码
    cmake_minimum_required(VERSION 3.4.1)
    project(MyAndroidProject)
    

    这里指定了项目的最低CMake版本和项目的名称。

  2. 设置编译选项

    cmake
    复制代码
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall")
    

    这个命令设置了编译选项,例如编译标准(这里是C++11)和警告。

  3. 添加源文件

    cmake
    复制代码
    add_library(my_native_lib SHARED native-lib.cpp)
    

    这个命令指定了要编译的库文件,并列出了所需的源文件。

  4. 添加依赖库

    cmake
    复制代码
    target_link_libraries(my_native_lib log)
    

    这个命令指定了my_native_lib库文件需要链接的系统库,例如log库。

  5. 设置头文件搜索路径

    cmake
    复制代码
    include_directories(include)
    

    这个命令告诉CMake去哪里搜索头文件。在Android开发中,通常不需要显式指定头文件路径,因为Android NDK已经将标准C/C++库的头文件路径包含在默认的搜索路径中。

  6. 设置源文件路径

    cmake
    复制代码
    set(SRC_DIR src/main/cpp)
    

    这个命令设置了源文件的目录路径。

  7. 添加子目录

    cmake
    复制代码
    add_subdirectory(${SRC_DIR})
    

    这个命令告诉CMake在当前项目中包含另一个目录,这里是${SRC_DIR}

  8. 配置库输出路径

    cmake
    复制代码
    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI})
    

    这个命令设置了生成的库文件输出路径。${ANDROID_ABI}是一个变量,表示当前的CPU架构。

  9. 添加库文件搜索路径

    cmake
    复制代码
    link_directories(${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI})
    

    这个命令告诉CMake在哪里搜索库文件。

  10. 安装规则

cmake
复制代码
install(TARGETS my_native_lib LIBRARY DESTINATION libs/${ANDROID_ABI})

这个命令定义了安装规则,将生成的库文件安装到指定的目录下。

以上是一个Android项目的CMakeLists.txt文件的基本用法和常见规则。根据实际项目需求,你可以组合和调整这些指令,以满足项目的构建需求。