CMake教程6:調用lib、dll

之前我們學到了如何編寫一個可執行程序和Library,在繼續學習之前,需要解釋下target,在cmake中我們可以給executablelibrary設置一個target名字,這樣可以方便我們在后續對target進行更加詳細的屬性設置。

本節我們將學習如何在項目中引用lib,相關的api有:

 

makefile

復制代碼

link_libraries(<item>... ...) # item鏈接到所有目標中 target_link_libraries(<target> ... <item>... ...) # 將item鏈接到指定的target中

其中item參數支持的情況比較多,提前介紹幾種情況:

  • lib name:提供庫的名字,讓cmake去查找對應的庫文件絕對路徑
  • lib fullpath:直接一步到位給出庫文件的絕對路徑
  • target name: 根據target的屬性,讓cmake查找對應庫文件的絕對路徑

target_xxx的命令顆粒度更細,是比較高版本的命令。

app調用有源代碼的lib

這種情況是有lib的源代碼,我們將lib以源代碼的方式鏈接到項目內

項目結構為:

  • main.cpp
  • lib.cpp
  • CMakeLists.txt
 

makefile

復制代碼

# app cmake_minimum_required(VERSION 3.0.0) set(app "demo") project(${app} VERSION 0.1.0) add_executable(${app} main.cpp) # lib set(lib "my-lib") project(${lib}) add_library(${lib} ./lib.cpp) # 將lib鏈接到app target_link_libraries(${app} ${lib})

需要注意的target_link_libraries

  • 第一個target參數來自add_executable的第一個參數
  • 后續item參數來自add_library的第一個參數

app調用第三方lib、dll

這種情況是我們使用第三方的lib,只有頭文件和庫文件(.a、.dll、*.so

方式1:imported-libraries

 

bash

復制代碼

# 設置target名字為dll,并且是一個外部導入的lib # GLOBAL選項可以將target的作用域變為全局,默認是只在目錄內可見 add_library(dll SHARED IMPORTED GLOBAL) # 設置target dll的詳細屬性,dll/lib 不區分debug/release的情況 set_target_properties(dll PROPERTIES # 指向lib,windows必須設置此項 IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/dll.lib # 指向dll、so等 IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/dll.dll ) # 設置debug/release set_target_properties(dll PROPERTIES IMPORTED_IMPLIB_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.lib IMPORTED_IMPLIB_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.lib IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.dll IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.dll ) target_link_libraries(app dll)

這里我們使用的是set_target_properties,可以同時給多個target設置多個不同的屬性:

 

scss

復制代碼

set_target_properties( target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ... )

方式2:將指定的庫文件直接鏈接到target的不同配置

 

bash

復制代碼

target_link_libraries(${target} debug ${debug_fullpath}) target_link_libraries(${target} optimized ${release_fullpath})

這兩種方式都可以,原因是target_link_libraries的item參數既可以是target name,也可以是lib fullpath

在xcode中,對應的工程配置為:

  • 當為target name時,出現在command的args中

    image.png

  • 當為lib fullpath時,在xcode中的位置在Linking/Others Linker Flags:

    image.png

無論使用哪種方式,注意dll、lib必須是存在的,底層查找lib時,不會自動補充lib前綴。

include頭文件目錄問題

以上僅僅是告訴編譯器lib文件的位置在哪里,我們需要添加頭文件目錄,編譯器才能識別到lib api

方式1:直接添加頭文件目錄,缺點是要手動把使用到的lib include path一個一個加進去,比較麻煩

 

bash

復制代碼

# 注意:要放在add_executable、add_library前邊才有效 include_directories("a/b/c/")

方式2:給lib target中添加,只要項目依賴了這個target,就會自動將目錄添加到項目中

 

makefile

復制代碼

# 注意:要放在add_library后邊才有效 target_include_directories(lib INTERFACE # 權限控制,類比:public/private/protected ${CMAKE_CURRENT_SOURCE_DIR}/ )

方式3:和方式2沒啥區別,寫法不同而已

 

makefile

復制代碼

set_property(TARGET lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR} )

推薦使用第2種方式。

lib包含目錄問題

這種情況對應的是我們target_link_libraries的item參數是lib name,為了讓CMake可以通過lib name找到對應的lib文件 ,所以我們才需要設置庫包含目錄,如果item參數是lib pathtarget name,則不需要設置庫包含目錄。

相關的命令有link_directoriestarget_link_directories,區別參考上文。

作者:xu__yanfeng
鏈接:https://juejin.cn/post/7157618014311940126
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/42177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/42177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/42177.shtml

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

相關文章

利用logstash/filebeat/插件,將graylog日志傳輸到kafka中

1.graylog配置輸出 在System-outputs&#xff0c;選擇GELF Output&#xff0c;填寫如下內容&#xff0c;其它選項默認 在要輸出的Stream中&#xff0c;選擇Manage Outputs 選擇GELF Output&#xff0c;右邊選擇剛才創建好的test。 2.安裝logstash&#xff0c;作為中間臨時…

LeetCode 786. 第 K 個最小的素數分數

&#x1f517; 原題鏈接&#xff1a;786. 第 K 個最小的素數分數 本題可以暴力求解&#xff1a; class Solution { public:vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {int n arr.size();vector<pair<int, int>> frac;for …

Vue使用jspdf和html2canvas組件庫結合導出PDF文件

效果圖&#xff1a; 1、安裝依賴&#xff1a; npm install html2canvas --save npm install jspdf --save 或 yarn add html2canvas --save yarn add jspdf --save 2、封裝全局調用方法&#xff1a;this.$exportPDF(#id,文件名) 新建js文件&#xff1a;/utils/html2Pdf.js&am…

在linux中,使用sh文件腳本啟動jar項目

使用方法 sh 執行腳本.sh [start|stop|restart|status]sh文件內容 APP_NAMEXXXX.jar#使用說明&#xff0c;用來提示輸入參數 usage() { echo "Usage: sh 執行腳本.sh [start|stop|restart|status]" exit 1 }#檢查程序是否在運行 is_exist(){ pidps -ef|grep $APP_N…

數據結構:選擇排序

簡單選擇排序 選擇排序是一種簡單直觀的排序算法。首先在未排序序列中找到最大&#xff08;最小&#xff09;的元素&#xff0c;存放到排序學列的其實位置&#xff0c;然后在剩余的未排序的元素中尋找最小&#xff08;最大&#xff09;元素&#xff0c;存放在已排序序列的后面…

高等數學:牛頓迭代發解方程

現在高數也要介紹牛頓法了&#xff0c;一般都是從幾何上直接以“切線法”直接引入的。這種引入方式的確很簡單&#xff0c;但如果脫離深入一點的分析就不大容易解釋后面的事情。所以就在想怎么更直接地從分析的角度來一條線貫穿&#xff0c;把整個過程說一說。 文章目錄 一、牛…

【深度學習】PyTorch快速入門

【深度學習】學習PyTorch基礎 介紹PyTorch 深度學習框架是一種軟件工具&#xff0c;旨在簡化和加速構建、訓練和部署深度學習模型的過程。深度學習框架提供了一系列的函數、類和工具&#xff0c;用于定義、優化和執行各種深度神經網絡模型。這些框架幫助研究人員和開發人員專注…

漏洞+常見漏洞修復建議

一、漏洞級別 高級別漏洞&#xff1a;大部分遠程和本地管理員權限漏洞 中級別漏洞&#xff1a;大部分普通用戶權限、權限提升、讀懂受限文件、遠程和本杜漏洞、拒絕服務漏洞 低級別漏洞&#xff1a;大部分遠程非授權文件存取、口令恢復、欺騙、信息泄露漏洞 二、漏洞掃描的…

Kotlin Lambda和高階函數

Lambda和高階函數 本文鏈接&#xff1a; 文章目錄 Lambda和高階函數 lambda輸出&#xff08;返回類型&#xff09;深入探究泛型 inline原理探究 高階函數集合、泛型自己實現Kotlin內置函數 擴展函數原理companion object 原理 > 靜態內部類函數式編程 lambda 1、lambda的由…

Flink流批一體計算(13):PyFlink Tabel API之SQL DDL

1. TableEnvironment 創建 TableEnvironment from pyflink.table import Environmentsettings, TableEnvironment# create a streaming TableEnvironmentenv_settings Environmentsettings.in_streaming_mode()table_env TableEnvironment.create(env_settings)# or create…

嵌入式Linux開發實操(九):CAN接口開發

前言: CAN網絡在汽車中的使用可以說相當廣泛。而CAN網絡需要的收發器最常用的就是NXP 的TJA1042: CAN網絡:

605. 種花問題

鏈接 假設有一個很長的花壇&#xff0c;一部分地塊種植了花&#xff0c;另一部分卻沒有。可是&#xff0c;花不能種植在相鄰的地塊上&#xff0c;它們會爭奪水源&#xff0c;兩者都會死去。給你一個整數數組 flowerbed 表示花壇&#xff0c;由若干 0 和 1 組成&#xff0c;其中…

8/16總結

WebSocket是雙向通信協議&#xff0c;模擬Socket協議&#xff0c;可以雙向發送或者接收信息 而Http是單向的 WebSocket是需要瀏覽器和服務器握手進行建立連接的 而http是瀏覽器發起向服務器的連接&#xff0c;服務器預先并不知道這個連接 WebSocket在建立握手時&#xff0c;數…

Python3內置函數大全

吐血整理 Python3內置函數大全 1.abs()函數2.all()函數3.any()函數4.ascii()函數5.bin()函數6.bool()函數7.bytes()函數8.challable()函數9.chr()函數10.classmethod()函數11.complex()函數12.complie()函數13.delattr()函數14.dict()函數15.dir()函數16.divmod()函數17.enumer…

注解@JsonInclude

注解JsonInclude 1. 注解由來 JsonInclude是一個用于Java類中字段或方法的注解&#xff0c;它來自于Jackson庫。Jackson庫是一個用于處理JSON數據的流行開源庫&#xff0c;在Java對象和JSON之間進行序列化和反序列化時經常被使用。 2. 注解示例 下面是JsonInclude注解的一個…

【kubernetes】Pod控制器

目錄 Pod控制器及其功用 pod控制器有多種類型 1、ReplicaSet ReplicaSet主要三個組件組成 2、Deployment 3、DaemonSet 4、StatefulSet 5、Job 6、Cronjob Pod與控制器之間的關系 1、Deployment 查看控制器配置 查看歷史版本 2、SatefulSet 為什么要有headless&…

2023-08-18力扣每日一題

鏈接&#xff1a; 1388. 3n 塊披薩 題意&#xff1a; 一個長度3n的環&#xff0c;選n次數字&#xff0c;每次選完以后相鄰的數字會消失&#xff0c;求選取結果最大值 解&#xff1a; 這波是~~&#xff08;ctrl&#xff09;CV工程師了~~ 核心思想是選取n個不相鄰的元素一定…

無涯教程-Perl - splice函數

描述 此函數從LENGTH元素的OFFSET元素中刪除ARRAY元素,如果指定,則用LIST替換刪除的元素。如果省略LENGTH,則從OFFSET開始刪除所有內容。 語法 以下是此函數的簡單語法- splice ARRAY, OFFSET, LENGTH, LISTsplice ARRAY, OFFSET, LENGTHsplice ARRAY, OFFSET返回值 該函數…

Vue 項目運行 npm install 時,卡在 sill idealTree buildDeps 沒有反應

解決方法&#xff1a;切換到淘寶鏡像。 以下是之前安裝的 xmzs 包&#xff0c;用于控制切換淘寶鏡像。 該截圖是之前其他項目切換淘寶鏡像的截圖。 切換鏡像后&#xff0c;順利執行 npm install 。

生成國密密鑰對

在線生成國密密鑰對 生成的密鑰對要妥善保管&#xff0c;丟失是無法找回的。