最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ Cmake的構(gòu)建靜態(tài)庫和動態(tài)庫詳解

 更新時間:2022年03月18日 10:20:48   作者:靜·無羨  
這篇文章主要為大家詳細介紹了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)庫在編譯時會直接整合到目標程序中,編譯成功的可執(zhí)行文件可以獨立運行

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

構(gòu)建示例

創(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

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

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

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

${LIBHELLO_SRC}:源文件

同時構(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)

動態(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í)行目標二進制
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();
}

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

 PS:include 這樣是可以的

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

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

INCLUDE_DIRECTORIES(/usr/local/include/hello)

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

關(guān)鍵字:LINK_DIRCTORIES 添加非標準的共享庫搜索路徑

指定第三方庫鎖在路徑,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_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

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!  

相關(guān)文章

  • C語言詳細分析講解多文件的程序設(shè)計

    C語言詳細分析講解多文件的程序設(shè)計

    所謂的C語言多文件編程就是,將代碼實現(xiàn)模塊化。比如說一個項目的一項功能放在一個一個文件里,然后將實現(xiàn)這個功能的函數(shù)放在一個c文件<BR>
    2022-04-04
  • C語言每日練習之冒泡排序

    C語言每日練習之冒泡排序

    這篇文章主要介紹了C語言冒泡排序,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-11-11
  • 詳談全排列next_permutation() 函數(shù)的用法(推薦)

    詳談全排列next_permutation() 函數(shù)的用法(推薦)

    下面小編就為大家?guī)硪黄斦勅帕衝ext_permutation() 函數(shù)的用法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 基于C語言字符串函數(shù)的一些使用心得

    基于C語言字符串函數(shù)的一些使用心得

    以下是對C語言中字符串函數(shù)的一些使用心得進行了詳細的介紹,需要的朋友可以過來參考下
    2013-08-08
  • 簡易Dota改鍵程序制作

    簡易Dota改鍵程序制作

    利用全局鉤子制作一個個性化的dota游戲改鍵功能,大家可以參考使用
    2013-11-11
  • C語言中求余運算符的使用解讀

    C語言中求余運算符的使用解讀

    這篇文章主要介紹了C語言中求余運算符的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 淺析C++中的函數(shù)重載

    淺析C++中的函數(shù)重載

    這篇文章主要介紹了淺析C++中的函數(shù)重載,在C++中,可以為兩個或兩個以上的函數(shù)提供相同的函數(shù)名稱,只要參數(shù)類型不同,或者參數(shù)類型相同而參數(shù)個數(shù)不同,又或者參數(shù)類型參數(shù)個數(shù)相同,參數(shù)次序不同,稱為函數(shù)重載,需要的朋友可以參考下
    2023-08-08
  • C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例

    C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例

    本文主要介紹了C/C++數(shù)字與字符串互相轉(zhuǎn)換的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • C++實現(xiàn)飛機大戰(zhàn)游戲

    C++實現(xiàn)飛機大戰(zhàn)游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)飛機大戰(zhàn)游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++初始化列表學習

    C++初始化列表學習

    在C++中,struct和class的唯一區(qū)別是默認的克訪問性不同,而這里我們不考慮訪問性的問題,所以下面的代碼都以struct來演示
    2013-09-09

最新評論

禄丰县| 平安县| 邹城市| 新巴尔虎左旗| 抚松县| 清远市| 桑植县| 海门市| 扶余县| 库车县| 庐江县| 双城市| 玛纳斯县| 全南县| 方山县| 黎城县| 恭城| 晋中市| 会东县| 滨州市| 南安市| 岐山县| 侯马市| 肇庆市| 金华市| 商南县| 嘉兴市| 那坡县| 拜城县| 滦南县| 松江区| 峨眉山市| 南皮县| 小金县| 齐齐哈尔市| 陈巴尔虎旗| 纳雍县| 泾源县| 庆安县| 新昌县| 乐陵市|