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.mzph.cn/web/64157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIA - IMSIC之二(附IMSIC处理流程图)

本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 ​​​​​​​通过IMSIC接收外部中断的CSR 软件通过《AIA - 新增的CSR》描述的CSR来访问IMSIC。 machine level 的 CSR 与 IMSIC 的 machine level interrupt file 可相互互动;而 supervisor level 的 CSR…

Vue单页应用的配置

前面通过几篇文章了解并掌握了 Vue 项目构建及运行的前期工作 。接下来我们可以走进 Vue 项目的内部&#xff0c;一探其内部配置的基本构成。 1. 路由配置 由于 Vue 这类型的框架都是以一个或多个单页构成&#xff0c;在单页内部跳转并不会重新渲染 HTML 文件&#xff0c;其路…

CocosCreator-引擎案例-TS:spine

工程1&#xff1a;LoadSpine&#xff1a;简单加载spine资源 建立工程&#xff0c;在层级上建立一个空对象&#xff0c;改名spine 在spine上添加spine组件&#xff1a; 添加组件>渲染组件>spine 在spine上挂上脚本loadspine onLoad () {cc.resources.load(loadSpine/ali…

使用FreeNAS软件部署ISCSI的SAN架构存储(IP-SAN)练习题

一&#xff0c;实验用到工具分别为&#xff1a; VMware虚拟机&#xff0c;安装教程&#xff1a;VMware Workstation Pro 17 安装图文教程 FreeNAS系统&#xff0c;安装教程&#xff1a;FreeNAS-11.2-U4.1安装教程2024&#xff08;图文教程&#xff09; 二&#xff0c;新建虚…

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs&#xff0c;这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…

【再谈设计模式】享元模式~对象共享的优化妙手

一、引言 在软件开发过程中&#xff0c;我们常常面临着创建大量细粒度对象的情况&#xff0c;这可能会导致内存占用过高、性能下降等问题。享元模式&#xff08;Flyweight Pattern&#xff09;就像是一位空间管理大师&#xff0c;它能够在不影响功能的前提下&#xff0c;有效地…

Milvus×EasyAi:如何用java从零搭建人脸识别应用

如何从零搭建一个人脸识别应用&#xff1f;不妨试试原生Java人工智能算法&#xff1a;EasyAi Milvus 的组合拳。 本文将使用到的软件和工具包括&#xff1a; EasyAi&#xff1a;人脸特征向量提取Milvus&#xff1a;向量数据库用于高效存储和检索数据。 01. EasyAi&#xff1a;…

NS3学习——tcpVegas算法代码详解(2)

NS3学习——tcpVegas算法代码详解&#xff08;1&#xff09;-CSDN博客 目录 4.TcpVegas类中成员函数 (5) CongestionStateSet函数 (6) IncreaseWindow函数 1.检查是否启用 Vgas 2.判断是否完成了一个“Vegas 周期” 2.1--if&#xff1a;判断RTT样本数量是否足够 2.2--e…

GitLab 将停止为中国区用户提供服务,60天迁移期如何应对? | LeetTalk Daily

“LeetTalk Daily”&#xff0c;每日科技前沿&#xff0c;由LeetTools AI精心筛选&#xff0c;为您带来最新鲜、最具洞察力的科技新闻。 GitLab作为一个广受欢迎的开源代码托管平台&#xff0c;近期宣布将停止服务中国大陆、澳门和香港地区的用户提供服务。根据官方通知&#x…

华为实训课笔记 2024 1223-1224

华为实训 12/2312/24 12/23 [Huawei]stp enable --开启STP display stp brief --查询STP MSTID Port Role STP State Protection 实例ID 端口 端口角色 端口状态 是否开启保护[Huawei]display stp vlan xxxx --查询制定vlan的生成树计算结…

《Java源力物语》-3.空值猎手

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 夜色渐深&#xff0c;在一处偏僻小径上&#xff0c;月光透过浓密的源力云层&#xff0c;在地面上投下斑驳的光影。String正独自练习着刚从…

科技云报到:人工智能时代“三大件”:生成式AI、数据、云服务

科技云报到原创。 就像自行车、手表和缝纫机是工业时代的“三大件”。生成式AI、数据、云服务正在成为智能时代的“新三大件”。加之全球人工智能新基建加速建设&#xff0c;成为了人类社会数字化迁徙的助推剂&#xff0c;让新三大件之间的耦合越来越紧密。从物理世界到数字世…

hiprint结合vue2项目实现静默打印详细使用步骤

代码地址是&#xff1a;vue-plugin-hiprint: hiprint for Vue2/Vue3 ⚡打印、打印设计、可视化设计器、报表设计、元素编辑、可视化打印编辑 本地安装包地址&#xff1a;electron-hiprint 发行版 - Gitee.com 1、先安装hipint安装包在本地 2、项目运行npm&#xff08;socket.…

CUDA各种内存和使用方法

文章目录 1、全局内存2、局部内存3、共享内存3.1 静态共享内存3.2 动态共享内存 4、纹理内存5、常量内存6、寄存器内存7、用CUDA运行时API函数查询设备CUDA 错误检测 1、全局内存 特点&#xff1a;容量最大&#xff0c;访问延时最大&#xff0c;所有线程都可以访问。 线性内存…

Chapter 03 复合数据类型-1

1.列表 Python内置的一种有序、可变的序列数据类型&#xff1b; 列表的定义&#xff1a; [ ]括起来的逗号分隔的多个元素组成的序列 列表对象的创建&#xff1a; &#xff08;1&#xff09;直接赋值 >>> list1 []#创建一个空列表赋值给list1 >>> list…

【后端】LNMP环境搭建

长期更新各种好文&#xff0c;建议关注收藏&#xff01; 本文近期更新完毕。 LNMPlinuxnginxmysqlphp 需要的资源 linux服务器 web服务软件nginx 对应的语言编译器代码文件 数据库mysql安装 tar.gz包或者命令行安装 进入root&#xff1a; sodu 或su mkdir path/{server,soft}…

基于PyQt5的UI界面开发——多界面切换

介绍 最初&#xff0c;因为课设的缘故&#xff0c;我只是想做一个通过按键进行切面切换而已&#xff0c;但是我看网上资料里面仅是语焉不详&#xff0c;让我困惑的很&#xff0c;但后面我通过摸索才发现这件事实在是太简单了&#xff0c;因此我想要记录下来。 本博客将介绍如…

操作002:HelloWorld

文章目录 操作002&#xff1a;HelloWorld一、目标二、具体操作1、创建Java工程①消息发送端&#xff08;生产者&#xff09;②消息接收端&#xff08;消费者&#xff09;③添加依赖 2、发送消息①Java代码②查看效果 3、接收消息①Java代码②控制台打印③查看后台管理界面 操作…

机器视觉检测相机基础知识 | 颜色 | 光源 | 镜头 | 分辨率 / 精度 / 公差

注&#xff1a;本文为 “keyence 视觉沙龙中机器视觉检测基础知识” 文章合辑。 机器视觉检测基础知识&#xff08;一&#xff09;颜色篇 视觉检测硬件构成的基本部分包括&#xff1a;处理器、相机、镜头、光源。 其中&#xff0c;和光源相关的最重要的两个参数就是光源颜色和…

【体验官招募】SoFlu - JavaAI 开发助手:开启智能开发新时代

你是否有过这样的经历&#xff1f;在深夜的办公室里&#xff0c;面对紧急的 Java 项目&#xff0c;看着厚厚的需求文档&#xff0c;你是否感到无从下手&#xff1f; 当你尝试理解客户那些复杂又模糊的需求时&#xff0c;是否会因为要和产品经理反复沟通确认每一个细节而感到厌…