CMake 构建项目并整理头文件和库文件

本文将介绍如何使用 CMake 构建项目、编译生成库文件,并将头文件和库文件整理到统一的目录中以便在其他项目中使用。


1. 项目结构

假设我们正在构建一个名为 rttr 的开源库,初始的项目结构如下:

D:\WorkCode\Demo\rttr-master\
    |- src\                   (源代码)
    |- include\               (可能的头文件目录,部分项目不提供该目录)
    |- CMakeLists.txt         (CMake 配置文件)
    |- build\                 (生成文件的输出目录,自己创建)

目标:

  1. 使用 CMake 编译项目。

  2. 将生成的库文件和头文件整理到一个 install 目录中:

    D:\WorkCode\Demo\rttr-master\install
    |- include\ (整理后的头文件目录)
    |- lib\ (整理后的库文件目录)


2. 使用 CMake 构建项目

步骤 1:配置 CMake 构建环境

使用以下命令克隆项目的主代码库:

bash 复制代码
git clone https://github.com/your/repo.git

https://github.com/your/repo.git 替换为实际的仓库地址。例如:

bash 复制代码
git clone https://github.com/rttrorg/rttr.git

如果项目依赖于子模块,使用以下命令获取子模块:

bash 复制代码
git submodule update --init --recursive

进入 build 目录,使用 CMake 配置构建环境:

bash 复制代码
cd D:\WorkCode\Demo\rttr-master\build
cmake .. -DCMAKE_INSTALL_PREFIX=D:/WorkCode/Demo/rttr-master/install

参数说明:

  • ..:指定上一级目录为源代码目录。
  • -DCMAKE_INSTALL_PREFIX:设置安装路径,构建完成后文件会整理到该路径下。
步骤 2:编译项目

使用以下命令编译项目:

bash 复制代码
cmake --build . --config Release

参数说明:

  • --config Release:指定生成 Release 版本的库文件(适用于多配置生成器,如 MSVC)。
步骤 3:安装文件

运行以下命令将头文件和库文件整理到指定目录:

bash 复制代码
cmake --install . --config Release

3. 检查整理结果

安装完成后,检查 install 目录中的内容:

D:\WorkCode\Demo\rttr-master\install\
    |- include\            (包含所有头文件,例如 `rttr/registration.h`)
    |- lib\                (包含所有库文件,例如 `rttr_core.lib` 或 `rttr_core.dll`)

如果项目没有提供 include 目录,可能需要手动从源码中复制相关头文件。


4. 手动整理头文件和库文件

如果 cmake --install 没有正确生成 includelib 目录,可以手动整理:

头文件
  1. 从项目的源码目录复制头文件:

    D:\WorkCode\Demo\rttr-master\src\
    

    D:\WorkCode\Demo\rttr-master\include\
    

    将其放入:

    D:\WorkCode\Demo\rttr-master\install\include\
    
库文件
  1. build 目录中找到生成的库文件(例如 ReleaseDebug 目录):

    D:\WorkCode\Demo\rttr-master\build\Release\rttr_core.lib
    
  2. 将库文件复制到:

    D:\WorkCode\Demo\rttr-master\install\lib\
    

5. 在其他项目中使用整理后的库

整理完成后,可以在其他项目中通过以下方式引用整理好的 RTTR 库。

CMake 示例配置
cmake 复制代码
# 更改编译器的代码页
add_compile_options(/source-charset:utf-8 /execution-charset:utf-8)

# 设置 RTTR 的安装路径
set(RTTR_ROOT D:/WorkCode/Demo/rttr-master/install)

# 包含头文件
include_directories(${RTTR_ROOT}/include)

# 链接库文件
target_link_libraries(${PROJECT_NAME} PRIVATE ${RTTR_ROOT}/lib/rttr_core.lib)

6. 验证项目配置

编写一个简单的测试程序,验证是否能够成功包含头文件并链接库文件。

测试代码
cpp 复制代码
#include <rttr/registration>
#include <iostream>

class MyClass {
public:
    MyClass(int val) : value(val) {}
    int GetValue() const { return value; }
    void SetValue(int val) { value = val; }

private:
    int value;
};

RTTR_REGISTRATION
{
    rttr::registration::class_<MyClass>("MyClass")
        .constructor<int>()
        .property("value", &MyClass::GetValue, &MyClass::SetValue);
}

int main() {
    auto myClassType = rttr::type::get_by_name("MyClass");
    if (myClassType.is_valid()) {
        std::cout << "RTTR integration successful!" << std::endl;

        // 动态创建对象
        rttr::variant obj = myClassType.create({42});
        if (obj.is_valid()) {
            // 访问属性
            rttr::property prop = myClassType.get_property("value");
            std::cout << "Initial Value: " << prop.get_value(obj).to_int() << std::endl;

            // 修改属性
            prop.set_value(obj, 100);
            std::cout << "Updated Value: " << prop.get_value(obj).to_int() << std::endl;
        }
    } else {
        std::cout << "RTTR integration failed." << std::endl;
    }
    return 0;
}
编译测试

使用上述 CMake 配置,运行程序,如果输出:

RTTR integration successful!

说明配置正确。


总结

  1. 使用 cmake --install 可以自动整理头文件和库文件。
  2. 如果整理失败,可以手动从源码中复制头文件,并将库文件移动到 lib 目录。
  3. 在其他项目中使用时,通过 include_directoriestarget_link_libraries 配置头文件和库文件路径。
  4. 如果遇到编码问题,那么更改编译器的代码页。
相关推荐
涛ing3 小时前
32. C 语言 安全函数( _s 尾缀)
linux·c语言·c++·vscode·算法·安全·vim
独正己身4 小时前
代码随想录day4
数据结构·c++·算法
我不是代码教父6 小时前
[原创](Modern C++)现代C++的关键性概念: 流格式化
c++·字符串格式化·流格式化·cout格式化
利刃大大7 小时前
【回溯+剪枝】找出所有子集的异或总和再求和 && 全排列Ⅱ
c++·算法·深度优先·剪枝
子燕若水7 小时前
mac 手工安装OpenSSL 3.4.0
c++
*TQK*7 小时前
ZZNUOJ(C/C++)基础练习1041——1050(详解版)
c语言·c++·编程知识点
ElseWhereR8 小时前
C++ 写一个简单的加减法计算器
开发语言·c++·算法
*TQK*8 小时前
ZZNUOJ(C/C++)基础练习1031——1040(详解版)
c语言·c++·编程知识点
※DX3906※8 小时前
cpp实战项目—string类的模拟实现
开发语言·c++
萌の鱼9 小时前
leetcode 2080. 区间内查询数字的频率
数据结构·c++·算法·leetcode