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.pswp.cn/web/64157.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64157.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64157.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【FAQ】HarmonyOS SDK 閉源開放能力 — Vision Kit(2)

1.問題描述&#xff1a; 人臉活體檢測返回上一頁App由沉浸式變為非沉浸式多了上下安全區域。 解決方案&#xff1a; 檢測結束后需要自己去設置沉浸式配置。 2.問題描述&#xff1a; Vision Kit文字識別是本地識別&#xff0c;還是上傳至服務器&#xff0c;由服務器來識別文…

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啟動成功…

lua debug相關方法詳解

lua debug相關方法詳解 1. debug.debug()2. debug.getinfo(func | level [, what])3. debug.getlocal(func-or-level, localindex)4. debug.setlocal(level, local_number, value)5. debug.getupvalue(func, upvalue_index)6. debug.setupvalue(func, upvalue_index, value)7. …

《計算機網絡(第7版)-謝希仁》期末考試復習題和答案(總結整理)

目錄 前言&#xff1a; 一、選擇題。 二、填空題。 三、名詞解釋。 四、簡答題。 前言&#xff1a; 這個自動標題自己帶了序號&#xff0c;一開始想全部選項和題號都改過來的&#xff0c;結果一看一百多個全是&#xff0c;懶得改了 一、選擇題。 1、廣域網覆蓋的地理范圍…

【再談設計模式】享元模式~對象共享的優化妙手

一、引言 在軟件開發過程中&#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的生成樹計算結…

企業數字化轉型中如何區分“IT投入”和“業務投入”

在數字化轉型的浪潮中&#xff0c;企業往往面臨一個關鍵問題&#xff1a;如何區分“IT投入”和“業務投入”&#xff1f;在很多企業中&#xff0c;這兩個概念往往被混淆&#xff0c;不少公司甚至認為“數字化轉型”就是“IT的事情”&#xff0c;但實際上&#xff0c;它們之間有…

【Spring AI】Spring AI Alibaba的簡單使用

提示&#xff1a;文章最后有詳細的參考文檔。 前提條件 SpringBoot版本為3.x以上JDK為17以上申請api-key&#xff0c;地址&#xff1a;百煉平臺 引入依賴 說明&#xff1a;我的springboot版本為3.2.4&#xff0c;spring-ai-alibaba-starter版本為1.0.0-M2.1(對應spring-ai版本…

《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…