溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

發(fā)布時間:2022-03-18 11:25:09 來源:億速云 閱讀:543 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要為大家展示了“C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么”這篇文章吧。

    靜態(tài)庫和動態(tài)庫的區(qū)別

    1、靜態(tài)庫的擴展名一般為".a"或者".lib";動態(tài)庫的擴展名一般為".so"或者".dll"。

    2、靜態(tài)庫在編譯時會直接整合到目標(biāo)程序中,編譯成功的可執(zhí)行文件可以獨立運行

    3、動態(tài)庫在編譯時不會放到連接的目標(biāo)程序中,即可執(zhí)行文件無法單獨運行。

    構(gòu)建示例

    創(chuàng)建新項目cmake02,包含目錄如下

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    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

    ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

    hello:就是正常的庫名,生成的名字前面會加上lib,最終產(chǎn)生的文件是libhello.so

    SHARED,動態(tài)庫STATIC,靜態(tài)庫

    ${LIBHELLO_SRC}:源文件

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    同時構(gòu)建靜態(tài)和動態(tài)庫

    //如果用這種方式,只會構(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})

    SET_TARGET_PROPERTIES

    這條指令可以用來設(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)

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    動態(tài)庫的版本號

    一般動態(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)

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    注意:安裝的時候,指定一下路徑,放到系統(tǒng)下

    cmake -DCMAKE_INSTALL_PERFIX=/usr ..

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    使用外部共享庫和頭文件

    新建cmake03目錄來使用外部共享庫和頭文件

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    main.cpp內(nèi)容

    #include <hello.h>
     
    int main()
    {
        HelloFunc();
    }

    解決 :make后頭文件找不到的問題

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

     PS:include 這樣是可以的

    關(guān)鍵字:INCLUDE_DIRECTORIES 這條指令可以用來向工程添加多個特定的頭文件搜索路徑,路徑之間用空格分割

    在CMakeLists.txt中加入頭文件搜索路徑

    INCLUDE_DIRECTORIES(/usr/local/include/hello)

    解決:找到引用的函數(shù)問題

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    關(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)

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

     cmake后make

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    執(zhí)行bin目錄下的./hello報錯

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    解決:mv /usr/local/lib/libhello.so /usr/lib64/

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

     查看main的鏈接情況

    C++中Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫是什么

    鏈接靜態(tài)庫

    TARGET_LINK_LIBRARIES(hello libhello.a) 

    特殊的環(huán)境變量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH

    注意:這兩個是環(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è)資訊頻道!

    向AI問一下細節(jié)

    免責(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)容。

    AI