1. 程式人生 > >動態庫、靜態庫編譯測試:含靜態庫連結動態庫、靜態庫,動態庫連結靜態庫、動態庫

動態庫、靜態庫編譯測試:含靜態庫連結動態庫、靜態庫,動態庫連結靜態庫、動態庫

本文的目的是測試各種型別庫的編譯後的使用效果,包括庫又連結其他庫的編譯方法,使用方法,依賴性等。

太長不看版:請跳至文章最後的總結對比表。

一。內容包含:

①靜態庫libbb.a依賴靜態庫libaa.a的測試;

②靜態庫libbb.a依賴動態庫libaa.so的測試;

③動態庫libbb.so依賴靜態庫libaa.a的測試;

④動態庫libbb.so依賴動態庫libaa.so的測試;

所用到的檔案列表:

aalib.cpp aalib.h        bblib.cpp bblib.h     main.cpp

二。原始碼:

aalib.h

#ifndef AALIB_H
#define AALIB_H
#include "stdio.h"
void helloAA();

#endif

********分割線**************

aalib.cpp

#include "aalib.h"

void helloAA()
{
    printf(" lib AAAAAAAAAAAAA\n ");
}

********分割線**************

bblib.h

#ifndef BBLIB_H
#define BBLIB_H

void helloBB();
void helloAB();

#endif

********分割線**************

bblib.cpp

#include "bblib.h"
#include "aalib.h"

void helloBB()
{
    printf(" lib BBBBBBBBBBBBBBBB \n");
}

void helloAB()
{
    printf(" *a*******************\n");
    helloAA();
    helloBB();
    printf(" *b*******************\n");
}

********分割線**************

main.cpp

#include "bblib.h"

int main()
{
    helloBB();

    helloAB();
}
 

三。測試過程

①靜態庫libbb.a依賴靜態庫libaa.a的測試

現在生成了靜態庫libaa.a和libbb.a,下面測試靜態庫的使用方法:

可以看到連結靜態庫的話要指定靜態庫依賴的靜態庫,否則編譯不過去!由此可見輕易不要連結靜態庫,因為你也許不知道你要用的靜態庫還依賴著哪些庫.......

那麼將所依賴的靜態庫編譯進靜態庫呢?試試

可以看到,使用命令ar rcs libbb.a bblib.o libaa.a並沒有起到作用,亦即libaa.a並沒有被編譯進libbb.a,因此編譯可執行程式時還需要連結libaa.a。

改用下面這種方式編譯,可行:

即編譯靜態庫libbb.a時不要連結libaa.a而是用aalib.o檔案,亦即編譯靜態庫連結靜態庫時不能直接連結靜態庫,而是用形成該靜態庫的那些.o檔案,可以使用 ar -x libaa.a來獲取靜態庫的所有.o檔案(注意:所有.o檔案的順序要對,被依賴的要放後面)。

②靜態庫libbb.a依賴動態庫libaa.so的測試

第一行命令:gcc -o libaa.so -shared -fPIC aalib.cpp

等價於:gcc -c -shared -fPIC aalib.cpp 加 gcc -o libaa.so -shared -fPIC aalib.o 這兩條(注意編譯.o時要加選項-shared -fPIC,否則無法生存.so)

可以看到,編譯可執行程式時只連結靜態庫不連結動態庫編譯不過去!執行時也需要動態庫libaa.so支援

那麼將動態庫編譯進靜態庫中呢?試試

可以看到,雖然編譯靜態庫libbb.a的時候連結了動態庫libaa.so,編譯可執行程式只連結靜態庫libbb.a也能編譯過去,但是在執行時還是要libaa.so動態庫支援。

③動態庫libbb.so依賴靜態庫libaa.a的測試

可以看到編譯libbb.so時連結靜態庫出錯,提示靜態庫需要使用-fPIC選項來編譯,那就按照提示的來修改編譯命令:

靜態庫所需的.o檔案使用-shared -fPIC編譯,然後在編譯動態庫的時候連結靜態庫好用了。並且編譯可執行檔案時不用連結被依賴的靜態庫。

來看一下這個動態庫libbb.so依賴哪些庫:

可以看到沒有依賴libaa.a這個靜態庫。

④動態庫libbb.so依賴動態庫libaa.so的測試

動態庫連結動態庫成功,並且編譯可執行檔案時也不用連結被依賴的庫,但是執行時還是要兩個動態庫支援。

四。總結

被依賴的庫aa 編譯庫aa的命令 直接庫bb 編譯庫bb的命令 編譯可執行程式的命令 編譯時是否需要庫aa 執行時是否需要庫aa
libaa.a

gcc -c aalib.cpp

 ar rcs libaa.a aalib.o

libbb.a gcc -c bblib.cpp                                ar rcs libbb.a bblib.o gcc -o out main.cpp libbb.a libaa.a 需要 不需要
libaa.a gcc -c aalib.cpp      ar rcs libaa.a aalib.o libbb.a gcc -c bblib.cpp                               ar rcs libbb.a bblib.o aalib.o gcc -o out main.cpp libbb.a  不需要 不需要
libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.a gcc -c bblib.cpp                               ar rcs libbb.a bblib.o libaa.so gcc -o out main.cpp libbb.a 不需要 需要
libaa.a gcc -c aalib.cpp      ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a 編譯libbb.so就出錯,無法編譯成動態庫
libaa.a gcc -c -shared -fPIC aalib.cpp               ar rcs libaa.a aalib.o libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp libaa.a gcc -o out main.cpp -L./ -lbb 不需要 不需要
libaa.so gcc -o libaa.so -shared -fPIC aalib.cpp libbb.so gcc -o libbb.so -shared -fPIC bblib.cpp -L./ -laa gcc -o out main.cpp -L./ -lbb 不需要 需要

其他說明:連結靜態庫時要注意順序,使用第二行的方法編譯直接庫libbb.a的時候用到被依賴庫的.o檔案,注意些個.o檔案的依賴順序也很重要,不能錯,被依賴的要放後面。另外:編譯好的動態庫要指定路徑,否則執行時找不到動態庫的位置。

五。結論

    由於本測試的初衷是找出一種方法使得編譯可執行程式時不連結那些被依賴的庫,因此第二行和第五行的組合可以作為備選方案。

相關推薦

動態靜態編譯測試靜態連結動態靜態動態連結靜態動態

本文的目的是測試各種型別庫的編譯後的使用效果,包括庫又連結其他庫的編譯方法,使用方法,依賴性等。 太長不看版:請跳至文章最後的總結對比表。 一。內容包含: ①靜態庫libbb.a依賴靜態庫libaa.a的測試; ②靜態庫libbb.a依賴動態庫libaa.so的測試;

心理測試四個生命力極強的野草選一個測你現在最缺..

阿里巴巴官方釋出微博稱,連續幾日,一篇名為《阿里員工透露:馬總早移走 1200 億人民幣!網友:不愧是老師》的文章被有組織的進行惡意傳播。阿里巴巴官方釋出微博稱,連續幾日,一篇名為《阿里員工透露:馬總早移走 1200 億人民幣!網友:不愧是老師》的文章被有組織的進行惡意傳播。 對此,阿里表示,該文完全捏造事

前端優化如何將多張圖示合併成一張做好資源連結優化?

前端素材資源一般由圖片、SVG、音訊、視訊組成,每個資源都會有一個獨立的連結請求,當一個web頁面素材過多時,這表示該頁面將會建立多次連結請求,這將直接導致頁面載入速度變慢。那麼是否可以將一些常用的圖示素材合併成一張圖片實現共用呢?答案是可以的,這樣在使用時只需建立一次連結

cmake編譯靜態/動態/可執行檔案及測試demo

0.編譯 # cd build # cmake .. # make -j4 //test.c測試demo #include <stdio.h>  int main(){   HelloFu

靜態動態dll檔案lib檔案隱式連結顯式連結淺見

靜態連結、動態連結 靜態庫和動態庫分別應用在靜態連結方式和動態連結方式中,所謂靜態連結方式是指在程式執行之前完成所有的連結工作,把靜態庫一起打包合入,生成一個可執行的目標檔案(EXE檔案)。所謂

g++ 編譯連結C++程式碼 生成與使用靜態動態

例如我有A.cpp、A.h、main.cpp 三個檔案 編譯連結C++程式碼: 第一步:g++ -c A.cpp main.cpp 這樣就可以編譯A.cpp和main.cpp的程式碼生成A.o和main.o檔案【因為A.cpp包含了A.h的標頭檔案,所以一般編譯時

【學習筆記】2017年7月18日MySQL測試模擬QQ數據

關系 ref sts one database 等級 weight insert phone 模擬測試: QQ數據庫管理 一、創建數據庫並添加關系和測試數據 1 ##創建QQ數據庫,完成簡單的測試 2 3 #創建數據庫 4 DROP DATABASE IF EX

【Mac + Python3.6 + facebook-wda】之IOS自動化(二)安裝facebook-wda並編寫簡易自動化測試腳本

以及 應用 hot cit you ins dfa 查看端口 介紹 上一篇介紹完如何安裝WDA,接下來開始正式安裝開發庫並編寫自動化腳本。 目錄: 一、安裝facebook-wda庫 二、通過WEditor定位元素 三、附錄:學習資料

關於原始檔標頭檔案,靜態連結檔案動態連結檔案的的理解

先從原始檔和標頭檔案的關係說起,由於是還是初學階段,只接觸了C++語言和windows平臺下的程式設計,所以只講這兩方面的東東, 標頭檔案的作用:對函式,變數,和類的宣告,其實在標頭檔案也可對一些特殊函式和變數定義,比如可以在標頭檔案中對行內函數和const型別變數定義,由於對類的宣告

解決從私下載下來已經編譯好的項目核心部分改變其編譯後的靜態資源後無法打包進改變部分的問題

直接 clean 解壓 進行 cat 工作目錄 運行 第一次 解決 首先,本人使用 idea開發。     情景:在idea上改變從公司私庫下載下來的公司產品,核心部分已經是編譯後下載下來的,其中包含所有靜態資源。      在idea中改變靜態資

MySQL數據(一)編譯安裝安裝後優化操作及超戶忘記數據密碼的解決方法

conf sco 試用 初始化 configure 修改 load his 解決方法 MySQL的下載地址:http://www.dev.mysql.com/downloads 準備工作:卸載rpm方式安裝的mysql-server、mysql       rpm -qa

iOS編譯OpenSSL靜態(使用指令碼自動編譯)

使用指令碼編譯:https://github.com/gitusrs/openssl-ios-build-shell-script 1、該指令碼只是一個OpenSSL編譯指令碼,使用時需要自己下載OpenSSL原始碼(openssl-*.tar.gz) 2、將 openssl-

原始檔標頭檔案,靜態連結檔案動態連結檔案的的理解

如果你把一個.exe檔案只接放到沒有操作系充的“裸機”上去執行,顯然是執行不了的,可是你把這個程式放在一個裝有windows系統的電腦上就能運行了,顯然,程式的執行還是得依靠windows作業系統,這裡就要說到.dll檔案,上面說到的連結這一步時的程式碼複製只講到對程式作者自已寫的檔案和.lib檔案中用到的程

靜態連結動態如何使用該靜態

網上有各種靜態庫的建立&使用的例子,但都是超級簡單的例子,比如,靜態庫,就直接來個printf(),就完事了! 其實,實際使用時,靜態庫會複雜很多,比如會呼叫很多其他的動態庫。 下圖就是個例子: 假設libXXX.a用了libpthre

數據---->應掌握的知識點概述

如何實現 數據 設計 掌握 伸縮性 原理 dbms 存儲 系統 第一部分 DBMS的功能以及實現該功能的原理 數據庫管理系統相關知識 DBMS如何存儲和管理大數據集(有效性和可伸縮性) DBMS是如何實現多用戶同時存取數據的(並發性) 系統出現故障時,DBMS如何保護數

4.非關系型數據(Nosql)之mongodb普通索引唯一索引

log 索引 xpl sys watermark lang mon style gravity  一:普通索引 1創建一個新的數據庫 > use toto; switched to db toto

4.創建數據服務器(MySQL)

期中架構 mysql 創建數據庫服務器(MySQL): # optimization by onekeysed -i ‘s#SELINUX=enforcing#SELINUX=disabled#‘ /etc/selinux/configgrep SELINUX=disabled /etc/selinu

Oracle數據中心雙活之道ASM vs VPLEX (轉)

復用 讀寫 並且 壓力測試 發出 我們 config 影響 計算節點 雙活方案對比:ASM vs V-PLEX 作者:王文傑 Oracle公司 Principle system analyst Oracle高級服務部 Oracle數據庫中心的災備的演變,經歷了多年的

在linux程序裏面知道一個函數地址改函數是屬於某個動態怎麽樣得到這個動態的全【轉】

main 動態庫 360doc 復制 address 函數 地址 ati content 轉自:http://www.360doc.com/content/17/1012/11/48326749_694292472.shtml 另外dl_iterate_phdr可以查到當

FFmpeg視頻編解碼無法解析的外部符號找不到inttypes.h文件的問題

detail program targe image types lib 包含 mage 程序 ffmpeg報錯,link2019,無法解析的外部符號。 以下嘗試: 在檢查 包含目錄、庫目錄、鏈接器輸入和系統環境變量 均設置無誤的情況下,包含的文件要寫成以下形式: ex