当前位置: 首页 > article >正文

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 构建环境

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

git clone https://github.com/your/repo.git

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

git clone https://github.com/rttrorg/rttr.git

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

git submodule update --init --recursive

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

cd D:\WorkCode\Demo\rttr-master\build
cmake .. -DCMAKE_INSTALL_PREFIX=D:/WorkCode/Demo/rttr-master/install

参数说明:

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

使用以下命令编译项目:

cmake --build . --config Release

参数说明:

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

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

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 示例配置
# 更改编译器的代码页
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. 验证项目配置

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

测试代码
#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. 如果遇到编码问题,那么更改编译器的代码页。

http://www.kler.cn/a/454091.html

相关文章:

  • Docker【初识Docker】
  • 如何从 0 到 1 ,打造全新一代分布式数据架构
  • LabVIEW数字式气压计自动检定系统
  • [代码随想录23回溯]回溯的组合问题+分割子串
  • MyBatis的插件运行原理,与如何编写一个插件
  • mongodb和Cassandra
  • 设计一个监控摄像头物联网IOT(webRTC、音视频、文件存储)
  • ios按键精灵自动化的脚本教程:自动点赞功能的实现
  • 几个网络故障排除案例
  • 【mysql】MVCC及实现原理
  • 替代传统FTP传输,镭速大数据传输系统实现安全高效数据流转!
  • 0/1 分数规划
  • 王佩丰24节Excel学习笔记——第十九讲:Indirect函数
  • Spring的IoC容器初始化分析
  • python12-变量的作用域
  • 阿里云人工智能ACA(五)——深度学习基础
  • Llama 3 预训练(二)
  • NLP-UIE(Universal Information Extraction)
  • Linux 更改Jenkins使用其他账户启动
  • 音视频采集推流时间戳记录方案
  • 解读:45页PPT ————2024 集团数据资产管理平台解决方案
  • go并发模型的详细介绍
  • HDFS与HBase有什么关系?
  • RAGFlow 基于深度文档理解构建的开源 RAG引擎 vm.max_map_count配置
  • vscode搭建C/C++环境
  • 利用OnnxRuntime进行torch模型部署(C++版)——以分类网络为例