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

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

相关文章:

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

本文将介绍如何使用 CMake 构建项目、编译生成库文件&#xff0c;并将头文件和库文件整理到统一的目录中以便在其他项目中使用。 1. 项目结构 假设我们正在构建一个名为 rttr 的开源库&#xff0c;初始的项目结构如下&#xff1a; D:\WorkCode\Demo\rttr-master\|- src\ …...

Boost之log日志使用

不讲理论&#xff0c;直接上在程序中可用代码&#xff1a; 一、引入Boost模块 开发环境&#xff1a;Visual Studio 2017 Boost库版本&#xff1a;1.68.0 安装方式&#xff1a;Nuget 安装命令&#xff1a; #只安装下面几个即可 Install-package boost -version 1.68.0 Install…...

多功能jquery图片预览放大镜插件

xZoom是一款多功能的jquery图片预览放大镜插件。它支持多种图片放大模式&#xff0c;可以和Fancy Box或Magnific Pop-up等插件结合使用&#xff0c;功能非常强大。 在线预览 下载 使用方法 在页面中引入jquery和xzoom.css以及xzoom.js文件。 <link rel"stylesheet&…...

CSS系列(39)-- Shapes详解

前端技术探索系列&#xff1a;CSS Shapes详解 ✨ 致读者&#xff1a;探索形状布局的艺术 &#x1f44b; 前端开发者们&#xff0c; 今天我们将深入探讨 CSS Shapes&#xff0c;这个强大的形状布局特性。 基础形状 &#x1f680; 圆形与椭圆 /* 基础圆形 */ .circle {widt…...

AI 神经网络在智能家居场景中的应用

在科技持续进步的当下&#xff0c;智能家居领域正经历着深刻变革&#xff0c;AI 神经网络技术的融入成为推动这一变革的关键力量&#xff0c;为家居生活带来了诸多显著变化与提升&#xff0c;本文将几种常见的AI算法应用做了一下总结&#xff0c;希望对物联网从业者有所帮助。 …...

Rocky DEM tutorial7_Conical Dryer_锥形干燥器

tutorial 7_Conical Dryer_锥形干燥器 文章目录 tutorial 7_Conical Dryer_锥形干燥器0. 目的1. 模型介绍2. 模型设置2.1设置physics2.2 导入几何2.3 设置motion2.4 Boundary边界设置2.5 设置材料2.6设置材料间相互作用2.7 创建粒子2.8 设置颗粒进口2.9 求解器设置3. 后处理Enj…...

CSS(二):美化网页元素

目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性&#xff1a; font-family&#xff1a;设置字体font-size&#xff1a;设置字体大小font-weight&#xff1a;设置字体的粗细&#xff08;如 normal, bold, lighter 等&#xff09;color&#xff1a;…...

平方根无迹卡尔曼滤波(SR-UKF)算法,用于处理三维非线性状态估计问题

本MATLAB 代码实现了平方根无迹卡尔曼滤波&#xff08;SR-UKF&#xff09;算法&#xff0c;用于处理三维非线性状态估计问题 文章目录 运行结果代码概述代码 运行结果 三轴状态曲线对比&#xff1a; 三轴误差曲线对比&#xff1a; 误差统计特性输出&#xff08;命令行截图&…...

【论文笔记】Visual Alignment Pre-training for Sign Language Translation

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Visual Alignment Pre-tra…...

NLP基础知识 - 向量化

NLP基础知识 - 向量化 目录 NLP基础知识 - 向量化 NLP基础知识 - 向量化目录什么是向量化&#xff1f;为什么需要向量化&#xff1f;常见的向量化方法1. 词袋模型&#xff08;Bag of Words, BoW&#xff09;2. TF-IDF&#xff08;词频-逆文档频率&#xff09;3. 词嵌入&#x…...

JAVA学习笔记_MySQL进阶

文章目录 存储引擎InnoDB引擎MyISAM引擎Memory存储引擎的选择 索引索引数据结构Btree(多路平衡查找树)BTreeHash索引为什么InnoDQB存储引擎采用Btree索引结构 索引分类思考题 索引语法索引性能分析慢查询日志show profiesexplain 索引的使用规则最左前缀法则索引失效SQL提示覆盖…...

ffmpeg: stream_loop报错 Error while filtering: Operation not permitted

问题描述 执行ffmpeg命令的时候&#xff0c;报错&#xff1a;Error while filtering: Operation not permitted 我得命令如下 ffmpeg -framerate 25 -y -i /data/workerspace/mtk/work_home/mtk_202406111543-l9CSU91H1f1b3/tmp/%08d.png -stream_loop -1 -i /data/workerspa…...

Vue.use()和Vue.component()

当很多页面用到同一个组件&#xff0c;又不想每次都在局部注册时&#xff0c;可以在main.js 中全局注册 Vue.component()一次只能注册一个组件 import CcInput from /components/cc-input.vue Vue.component(CcInput);Vue.use()一次可以注册多个组件 对于自定义的组件&#…...

javaweb 04 springmvc

0.1 在上一次的课程中&#xff0c;我们开发了springbootweb的入门程序。 基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求 /hello 后 &#xff0c;给浏览器返回字符串 “Hello World ~”。 其实呢&#xff0c;是我们在浏览器发起请求&#xff0c;请求了我们…...

[Visual studio] 性能探测器

最近发现VS的profile还是很好用的&#xff0c; 可以找到项目代码的瓶颈&#xff0c;比如发现CPU的每一个函数的时间占比&#xff0c;分析代码耗时分布&#xff0c;和火焰图一样的效果 如何使用 1. 打开你的项目&#xff0c;调整成release状态 2. 点击调试->性能探测器 3…...

【漫话机器学习系列】017.大O算法(Big-O Notation)

大 O 表示法&#xff08;Big-O Notation&#xff09; 大 O 表示法是一种用于描述算法复杂性的数学符号&#xff0c;主要用于衡量算法的效率&#xff0c;特别是随着输入规模增大时算法的运行时间或占用空间的增长趋势。 基本概念 时间复杂度 描述算法所需的运行时间如何随输入数…...

IntelliJ IDEA中设置激活的profile

在IntelliJ IDEA中设置激活的profile&#xff0c;可以通过以下步骤进行&#xff1a; 通过Run/Debug Configurations设置 打开Run/Debug Configurations对话框&#xff1a; 在IDEA的顶部菜单栏中&#xff0c;选择“Run”菜单&#xff0c;然后点击“Edit Configurations...”或者…...

Qt 的信号槽机制详解:之信号槽引发的 Segmentation Fault 问题拆析(上)

Qt 的信号槽机制详解&#xff1a;之因信号槽误用引发的 Segmentation Fault 问题拆析&#xff08;上&#xff09; 前言一. 信号与槽的基本概念信号&#xff08;Signal&#xff09;槽&#xff08;Slot&#xff09;连接信号与槽 二. 信号槽机制的实现原理元对象系统&#xff08;M…...

uniapp中实现APP调用本地通知栏通知、震动、本地提示音或者mp3提醒

要在uniapp中实现APP调用本地通知栏通知、震动和本地提示音或者mp3提醒&#xff0c;你可以使用uni-app提供的原生API和插件来实现。 通知栏通知&#xff1a; 你可以使用uni-app的原生API uni.showToast() 或者 uni.showModal() 来实现通知栏通知的功能。可以在需要发送通知的地…...

ADB 上传文件并使用脚本监控上传百分比

有个需求&#xff0c;需要测试 emmc的外部连续写入性能&#xff0c;使用 ADB 上传一个巨大的文件。并且在上传到一定值时进行干预。 因此但是 adb push 命令本身会 block 运行并且不返回进度&#xff0c;因此需要一个额外的监控脚本。 上传脚本&#xff1a; echo off setloc…...

​​​​​​​中山网站建设哪家好?从AI搜索变革看网站建设的规范流程

在讨论“中山网站建设哪家好”之前&#xff0c;有一个更底层的问题需要先理解&#xff1a;&#x1f449; 网站的价值&#xff0c;正在被AI重新定义。一、信息获取路径正在发生根本变化过去二十年&#xff0c;用户获取信息的方式大致是&#xff1a;用户提出问题 → 打开搜索引擎…...

像素剧本圣殿详细步骤:如何重置时空+保存平行宇宙创作记录

像素剧本圣殿详细步骤&#xff1a;如何重置时空保存平行宇宙创作记录 1. 认识像素剧本圣殿 像素剧本圣殿是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。它将强大的AI推理能力与独特的8-Bit复古美学相结合&#xff0c;为创作者提供了一个沉浸式的剧本开发环境。…...

用CT001解读Type-C线材设计:为什么只有一个CC灯亮?

拿到POWER-Z CT001测试仪&#xff0c;很多用户第一次测试C to C线材时&#xff0c;都会产生一个疑问&#xff1a;为什么线材明明能正常充电&#xff0c;CT001上却只有一个CC指示灯亮起&#xff1f;另一个CC对应的位置始终不亮&#xff0c;是线材有问题吗&#xff1f; 答案很明确…...

宝塔部署前后端时,配置域名与ssl证书

创建文件夹1.后端部署部署之后点击设置这步骤最关键# HTTP反向代理相关配置开始 >>>location ~ /purge(/.*) {proxy_cache_purge cache_one $Host$request_uri$is_args$args;}location / {proxy_pass http://127.0.0.1:8773;proxy_set_header Host $Host:$server_port…...

鸿蒙开发实战:HDC工具在本地模拟器中的高效调试技巧

1. HDC工具入门&#xff1a;鸿蒙开发的瑞士军刀 第一次接触HDC工具时&#xff0c;我把它当成了鸿蒙版的ADB。但用久了才发现&#xff0c;这个看似简单的命令行工具&#xff0c;其实是鸿蒙开发的万能钥匙。HDC全称Huawei Device Connector&#xff0c;就像它的名字一样&#xff…...

OpenClaw配置文件详解:Qwen3.5-9B高级参数调优手册

OpenClaw配置文件详解&#xff1a;Qwen3.5-9B高级参数调优手册 1. 为什么需要手动调优OpenClaw配置 上周我尝试用OpenClaw自动处理一批技术文档的归档工作&#xff0c;发现同样的任务在不同时段完成速度差异巨大。有时30分钟就能搞定&#xff0c;有时却要卡顿近2小时。这促使…...

Flink的反压机制

目录 1. 什么是反压? 2. Flink 反压机制的演变 第一代:基于 TCP 的传播(Flink 1.5 之前) 第二代:基于信用制的反压(Flink 1.5+,当前版本) 3. 基于信用制的反压详解 核心组件 工作流程(对应上图) 优势 4. 如何识别和处理反压? 识别(通过 Flink Web UI) …...

OpenClaw长任务优化:Qwen3-32B本地接口降低Token消耗实测

OpenClaw长任务优化&#xff1a;Qwen3-32B本地接口降低Token消耗实测 1. 为什么需要关注长任务Token消耗 去年冬天&#xff0c;当我第一次用OpenClaw整理全年积累的2000多份PDF文档时&#xff0c;账单上的API费用让我倒吸一口凉气——这个简单的文件分类任务竟然消耗了价值30…...

Arduino I²C pH传感器库:高鲁棒性嵌入式pH测量方案

1. 项目概述 iarduino_I2C_pH 是一款专为 iArduino 系列 IC 接口 pH 传感器模块设计的 Arduino 兼容 C 库。该库面向嵌入式硬件工程师与固件开发者&#xff0c;提供对 pH-метр&#xff08;pH 计&#xff09;模块的完整底层控制能力&#xff0c;支持标准硬件 IC 外设&#…...

2025届学术党必备的降重复率网站横评

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 研究人工智能开题报告的工具&#xff0c;借助自然语言处理技术&#xff0c;靠着学术大数据分…...