網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
C++?Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)詳解_C 語(yǔ)言
作者:靜·無(wú)羨 ? 更新時(shí)間: 2022-05-21 編程語(yǔ)言靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別
1、靜態(tài)庫(kù)的擴(kuò)展名一般為".a"或者".lib";動(dòng)態(tài)庫(kù)的擴(kuò)展名一般為".so"或者".dll"。
2、靜態(tài)庫(kù)在編譯時(shí)會(huì)直接整合到目標(biāo)程序中,編譯成功的可執(zhí)行文件可以獨(dú)立運(yùn)行
3、動(dòng)態(tài)庫(kù)在編譯時(shí)不會(huì)放到連接的目標(biāo)程序中,即可執(zhí)行文件無(wú)法單獨(dú)運(yùn)行。
構(gòu)建示例
創(chuàng)建新項(xiàng)目cmake02,包含目錄如下
?hello.h中的內(nèi)容
#ifndef HELLO_H #define HELLO_H void HelloFunc(); #endif
?hello.cpp中的內(nèi)容
#include "hello.h" #includeusing namespace std; void HelloFunc() { cout<<"Hello World"<
項(xiàng)目中CMakeLists.txt內(nèi)容
PROJECT(HELLO) ADD_SUBDIRECTORY(lib bin)
lib中CMakeLists.txt內(nèi)容
SET(LIBHELLO_SRC hello.cpp) ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
hello:就是正常的庫(kù)名,生成的名字前面會(huì)加上lib,最終產(chǎn)生的文件是libhello.so
SHARED,動(dòng)態(tài)庫(kù)STATIC,靜態(tài)庫(kù)
${LIBHELLO_SRC}:源文件
同時(shí)構(gòu)建靜態(tài)和動(dòng)態(tài)庫(kù)
//如果用這種方式,只會(huì)構(gòu)建一個(gè)動(dòng)態(tài)庫(kù),不會(huì)構(gòu)建出靜態(tài)庫(kù),雖然靜態(tài)庫(kù)的后綴是.a
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
//修改靜態(tài)庫(kù)的名字,這樣是可以的,但是我們往往希望他們的名字是相同的,只是后綴不同而已
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC?${LIBHELLO_SRC})
SET_TARGET_PROPERTIES
這條指令可以用來(lái)設(shè)置輸出的名稱,對(duì)于動(dòng)態(tài)庫(kù),還可以用來(lái)指定動(dòng)態(tài)庫(kù)版本和API版本
同時(shí)構(gòu)建靜態(tài)和動(dòng)態(tài)庫(kù)示例
SET(LIBHELLO_SRC hello.cpp) ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT$ ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) SET_TARGET_PROPERTIES(hello PROPERTIES OUTPUT_NAME "hello") SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)
動(dòng)態(tài)庫(kù)的版本號(hào)
一般動(dòng)態(tài)庫(kù)都會(huì)有一個(gè)版本號(hào)的關(guān)聯(lián)
libhello.so.1.2
libhello.so->libhello.so.1
libhello.so.1->libhello.so.1.2
CMakeList.txt插入如下
SET_TARGET_PROPERTIES(hello PROPERTIES VERSION 1.2 SOVERSION 1)
?VERSION指代動(dòng)態(tài)庫(kù)版本,SOVERSION指代API版本
安裝共享庫(kù)和頭文件
本例中我們將hello的共享庫(kù)安裝到
將hello.h安裝到
//文件放到該目錄下 INSTALL(FILES hello.h DESTINATION include/hello) //二進(jìn)制,靜態(tài)庫(kù),動(dòng)態(tài)庫(kù)安裝都是用TARGETS //ARCHIVE特指靜態(tài)庫(kù),LIBRATY特指動(dòng)態(tài)庫(kù),RUNTIME特指可執(zhí)行目標(biāo)二進(jìn)制 INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
注意:安裝的時(shí)候,指定一下路徑,放到系統(tǒng)下
cmake -DCMAKE_INSTALL_PERFIX=/usr ..
使用外部共享庫(kù)和頭文件
新建cmake03目錄來(lái)使用外部共享庫(kù)和頭文件
main.cpp內(nèi)容
#includeint main() { HelloFunc(); }
解決 :make后頭文件找不到的問(wèn)題
?PS:include
這樣是可以的
關(guān)鍵字:INCLUDE_DIRECTORIES
這條指令可以用來(lái)向工程添加多個(gè)特定的頭文件搜索路徑,路徑之間用空格分割
在CMakeLists.txt中加入頭文件搜索路徑
INCLUDE_DIRECTORIES(/usr/local/include/hello)
解決:找到引用的函數(shù)問(wèn)題
關(guān)鍵字:LINK_DIRCTORIES
添加非標(biāo)準(zhǔn)的共享庫(kù)搜索路徑
指定第三方庫(kù)鎖在路徑,LINK_DIRECTORIES(/home/myproject/libs)
關(guān)鍵字:TARGET_LINK_LIBRARIES
添加需要鏈接的共享庫(kù)
TARGET_LINK_LIBRARIES
的時(shí)候,只需要給出動(dòng)態(tài)鏈接庫(kù)的名字就行了。
在CMakeLists.txt
中插入連接共享庫(kù),主要要插在executable的后面
TARGET_LINK_LIBRARIES(hello?libhello.so)
?cmake后make
執(zhí)行bin目錄下的./hello報(bào)錯(cuò)
解決:mv /usr/local/lib/libhello.so /usr/lib64/
?查看main的鏈接情況
鏈接靜態(tài)庫(kù)
TARGET_LINK_LIBRARIES(hello libhello.a)?
特殊的環(huán)境變量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH
注意:這兩個(gè)是環(huán)境變量而不是cmake變量,可以在linux的bash中進(jìn)行設(shè)置
在上面例子中使用了絕對(duì)路徑INCLUDE_DIRECTORIES(/usr/include/hello)
來(lái)指明include路徑的位置
我們還可以使用環(huán)境變量export CMAKE_INCLUDE_PATH=/usr/local/include/hello
生產(chǎn)debug版本的方法:
cmake .. -DCMAKE_BUILD_TYPE=debug
總結(jié)
原文鏈接:https://blog.csdn.net/qq_43577213/article/details/123531206
相關(guān)推薦
- 2022-11-06 React中Suspense及l(fā)azy()懶加載及代碼分割原理和使用方式_React
- 2023-01-20 GO語(yǔ)言函數(shù)(func)的聲明與使用詳解_Golang
- 2022-06-12 使用c++實(shí)現(xiàn)異或加密的代碼示例_C 語(yǔ)言
- 2022-04-23 elementui el-pagination 分頁(yè)組件封裝
- 2023-07-17 uniapp 用forEach循環(huán)遍歷數(shù)組
- 2022-02-02 Ant Design Pro在使用TreeSelect樹選擇組件時(shí),報(bào)錯(cuò)未注冊(cè)
- 2022-06-02 Python中函數(shù)的創(chuàng)建與調(diào)用你了解嗎_python
- 2022-09-25 MongoDB聚合管道 $lookup 與$mergeObjects配合使用 以及使用let,pip
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支