日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(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"
#include 
using 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ù)安裝到/lib目錄

將hello.h安裝到/include/hello目錄

//文件放到該目錄下
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)容

#include 
 
int 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

欄目分類
最近更新