您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么”這篇文章吧。
1、靜態(tài)庫的擴展名一般為".a"或者".lib";動態(tài)庫的擴展名一般為".so"或者".dll"。
2、靜態(tài)庫在編譯時會直接整合到目標(biāo)程序中,編譯成功的可執(zhí)行文件可以獨立運行
3、動態(tài)庫在編譯時不會放到連接的目標(biāo)程序中,即可執(zhí)行文件無法單獨運行。
創(chuàng)建新項目cmake02,包含目錄如下
hello.h中的內(nèi)容
#ifndef HELLO_H #define HELLO_H void HelloFunc(); #endif
hello.cpp中的內(nèi)容
#include "hello.h" #include <iostream> using namespace std; void HelloFunc() { cout<<"Hello World"<<endl; }
項目中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(hello SHARED ${LIBHELLO_SRC})
hello:就是正常的庫名,生成的名字前面會加上lib,最終產(chǎn)生的文件是libhello.so
SHARED,動態(tài)庫STATIC,靜態(tài)庫
${LIBHELLO_SRC}:源文件
//如果用這種方式,只會構(gòu)建一個動態(tài)庫,不會構(gòu)建出靜態(tài)庫,雖然靜態(tài)庫的后綴是.a
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC})
//修改靜態(tài)庫的名字,這樣是可以的,但是我們往往希望他們的名字是相同的,只是后綴不同而已
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})
這條指令可以用來設(shè)置輸出的名稱,對于動態(tài)庫,還可以用來指定動態(tài)庫版本和API版本
同時構(gòu)建靜態(tài)和動態(tài)庫示例
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)
一般動態(tài)庫都會有一個版本號的關(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指代動態(tài)庫版本,SOVERSION指代API版本
本例中我們將hello的共享庫安裝到<prefix>/lib目錄
將hello.h安裝到<prefix>/include/hello目錄
//文件放到該目錄下 INSTALL(FILES hello.h DESTINATION include/hello) //二進制,靜態(tài)庫,動態(tài)庫安裝都是用TARGETS //ARCHIVE特指靜態(tài)庫,LIBRATY特指動態(tài)庫,RUNTIME特指可執(zhí)行目標(biāo)二進制 INSTALL(TARGETS hello hello_static LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
注意:安裝的時候,指定一下路徑,放到系統(tǒng)下
cmake -DCMAKE_INSTALL_PERFIX=/usr ..
新建cmake03目錄來使用外部共享庫和頭文件
main.cpp內(nèi)容
#include <hello.h> int main() { HelloFunc(); }
PS:include
這樣是可以的
關(guān)鍵字:INCLUDE_DIRECTORIES
這條指令可以用來向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分割
在CMakeLists.txt中加入頭文件搜索路徑
INCLUDE_DIRECTORIES(/usr/local/include/hello)
關(guān)鍵字:LINK_DIRCTORIES
添加非標(biāo)準(zhǔn)的共享庫搜索路徑
指定第三方庫鎖在路徑,LINK_DIRECTORIES(/home/myproject/libs)
關(guān)鍵字:TARGET_LINK_LIBRARIES
添加需要鏈接的共享庫
TARGET_LINK_LIBRARIES
的時候,只需要給出動態(tài)鏈接庫的名字就行了。
在CMakeLists.txt
中插入連接共享庫,主要要插在executable的后面
TARGET_LINK_LIBRARIES(hello libhello.so)
cmake后make
執(zhí)行bin目錄下的./hello報錯
解決:mv /usr/local/lib/libhello.so /usr/lib64/
查看main的鏈接情況
鏈接靜態(tài)庫
TARGET_LINK_LIBRARIES(hello libhello.a)
注意:這兩個是環(huán)境變量而不是cmake變量,可以在linux的bash中進行設(shè)置
在上面例子中使用了絕對路徑INCLUDE_DIRECTORIES(/usr/include/hello)
來指明include路徑的位置
我們還可以使用環(huán)境變量export CMAKE_INCLUDE_PATH=/usr/local/include/hello
生產(chǎn)debug版本的方法:
cmake .. -DCMAKE_BUILD_TYPE=debug
以上是“C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。