欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2022年03月18日 10:20:48   作者:靜·無(wú)羨  
這篇文章主要為大家詳細(xì)介紹了C++ Cmake的構(gòu)建靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

靜態(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 <iostream>
using namespace std;
 
void HelloFunc()
{
    cout<<"Hello World"<<endl;
}

項(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ù)安裝到<prefix>/lib目錄

將hello.h安裝到<prefix>/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 <hello.h>
 
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é)

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

相關(guān)文章

  • c++連接mysql數(shù)據(jù)庫(kù)的兩種方法(ADO連接和mysql api連接)

    c++連接mysql數(shù)據(jù)庫(kù)的兩種方法(ADO連接和mysql api連接)

    現(xiàn)在正做一個(gè)接口,通過(guò)不同的連接字符串操作不同的數(shù)據(jù)庫(kù)。要用到mysql數(shù)據(jù)庫(kù),C++連接mysql有2種方法:利用ADO連接、利用mysql自己的api函數(shù)進(jìn)行連接,下面看看如何用吧
    2013-12-12
  • C++之&與*符號(hào)用法案例詳解

    C++之&與*符號(hào)用法案例詳解

    這篇文章主要介紹了C++之&與*符號(hào)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • C++ string.erase()用法詳解

    C++ string.erase()用法詳解

    這篇文章主要介紹了C++ string.erase()用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼

    Linux C 獲取進(jìn)程退出值的實(shí)現(xiàn)代碼

    本篇文章是對(duì)在Linux下使用c語(yǔ)言獲取進(jìn)程退出值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中友元函數(shù)(friend)解析

    C++中友元函數(shù)(friend)解析

    這篇文章主要分享了C++友元函數(shù)講解,C++提供了一種形式的訪問(wèn)權(quán)限,叫做友元,友元有三種,分別是友元函數(shù)、友元類和友元成員函數(shù),下面將詳細(xì)介紹該內(nèi)容,需要的小伙伴可以參考一下
    2022-01-01
  • c語(yǔ)言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語(yǔ)言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語(yǔ)言實(shí)現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下
    2014-04-04
  • C++實(shí)現(xiàn)LeetCode(121.買賣股票的最佳時(shí)間)

    C++實(shí)現(xiàn)LeetCode(121.買賣股票的最佳時(shí)間)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(121.買賣股票的最佳時(shí)間),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法

    Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法

    這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++計(jì)算任意權(quán)值的單源最短路徑(Bellman-Ford)

    C++計(jì)算任意權(quán)值的單源最短路徑(Bellman-Ford)

    這篇文章主要為大家詳細(xì)介紹了C++計(jì)算任意權(quán)值的單源最短路徑,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語(yǔ)言練習(xí)題:求1到10的階乘之和簡(jiǎn)單實(shí)例

    C語(yǔ)言練習(xí)題:求1到10的階乘之和簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇C語(yǔ)言練習(xí)題:求1到10的階乘之和簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-05-05

最新評(píng)論