当前位置: 首页 > 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…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...