1. 程式人生 > >gcc 編譯動態庫及連結

gcc 編譯動態庫及連結

1.testa.c

  1. #include <stdio.h>
  2. void Test_a()  
  3. {  
  4.   printf("This is Test_a!");  
  5. }  
2. testb.c
  1. #include <stdio.h>
  2. void Test_b()  
  3. {  
  4.   printf("This is Test_b!");  
  5. }  

3. testc.c
  1. #include <stdio.h>
  2. void Test_c()  
  3. {  
  4.   printf("This is Test_c!");  
  5. }  
4. testh.h
  1. void Test_a();  
  2. void
     Test_b();  
  3. void Test_c();  

5. main.c

  1. #include "testh.h"
  2. int main()  
  3. {  
  4.   Test_a();  
  5.   Test_b();  
  6.   Test_c();  
  7.   return 0;  
  8. }  
現在,我們將三個test函式編譯為一個動態庫,使用一下命令:
  1. gcc -fPIC -shared testa.c testb.c testc.c -o libtest.so  
生成了libtest.so檔案,其中,命令中

-shared該選項指定生成動態連線庫(讓聯結器生成T型別的匯出符號表,有時候也生成弱連線W型別的匯出符號),不用該標誌外部程式無法連線。相當於一個可執行檔案


-fPIC:表示編譯為位置獨立的程式碼,不用此選項的話編譯後的程式碼是位置相關的所以動態載入時是通過程式碼拷貝的方式來滿足不同程序的需要,而不能達到真正程式碼段共享的目的。

然後,通過通過命令

  1. gcc main.c -L. -ltest -omain  
編譯生成應用程式main,其中命令中

-L.:表示要連線的庫在當前目錄中
-ltest:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

    我們知道一個程式要想在記憶體中執行,除了編譯之外還要經過連結和裝入這兩個步驟。當然linux中動態連結也是經過這三個過程。Linux 使用這個ld-linux.so*中的來裝載(其實這只是一個連結)其他庫。所以這個庫必須放在linux中/lib下。對於其他,通常我們共享庫放在/lib這個路徑下,而且也是系統預設的搜尋路徑。
Linux共享庫的搜尋路徑先後順序:
1、編譯目的碼時指定的動態庫搜尋路徑:在編譯的時候指定-Wl,-rpath=路徑
2、環境變數LD_LIBRARY_PATH指定的動態庫搜尋路徑
3、配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑
4、預設的動態庫搜尋路徑/lib
5、預設的動態庫搜尋路徑 /usr/lib

此處,我們使用了第2中方法來使用該動態庫,先執行以下命令,設定LD_LIBRARY_PATH的值

  1. export LD_LIBRARY_PATH=.  
之後,使用一下命令即可
  1. ./main 

相關推薦

gcc 編譯動態連結

1.testa.c #include <stdio.h>void Test_a()  {    printf("This is Test_a!");  }   2. testb.c #include <stdio.h>void Test_b(

GCC 編譯動態 so檔案時,靜態連結libmysqlclient.a 與動態連結引數一起使用問題。

直接放結論, 下面是編譯一個使用了mysql C API 的 mysql.so 檔案(我們的業務中,它是zbx加裁的modules so檔案) gcc -fPIC -shared -o mysql.so mysql.c \ -I/usr/include

使用gcc生成動態使用動態的方法

gcc常用編譯選項: 選項 含義 -static 連結靜態庫,禁止使用動態庫 -shared 進行動態庫編譯,連結動態庫 -Ldir 在動態庫的搜尋路

gcc編譯】使用gcc編譯動態

測試程式碼是在Ubuntu18.04測試。 程式碼如下: hello.c #include <stdio.h> #include "myprint.h" int main() { pri

Makefile 編譯動態檔案連結動態

原文轉自 :http://www.cnblogs.com/ljtknowns/p/5647793.html 檔案目錄結構如下 1 dynamiclibapp.c 2 Makefile 3 comm/inc/apue.h 4 comm/errorhandle.c 5

gcc動態和靜態連結順序

so檔案:動態庫 a檔案: 靜態庫 exe檔案:可執行程式(linux下以檔案屬性來標示是否是可執行檔案,與字尾名無關) gcc中連結順序問題,總結出以下幾點: 1,動態庫中可以包含另一個靜態庫,通過引數 -lxxx 把靜態庫libxxx.a加入so檔案中,這樣so檔案中 &nbs

gcc使用---動態連結靜態

       00001f18 a _DYNAMIC        00001ff4 a _GLOBAL_OFFSET_TABLE_w _Jv_RegisterClasses        00001f08 d __CTOR_END__        00001f04 d __CTOR_LIST__    

Linux下GCC 編譯時如何指定連結

-l引數和-L引數 -l引數就是用來指定程式要連結的庫,-l引數緊接著就是庫名,那麼庫名跟真正的庫檔名有什麼關係呢?就拿數學庫來說,他的庫名是m,他的庫檔名是libm.so,很容易看出,把庫檔名的頭lib和尾.so去掉就是庫名了。當我們自已要用到一個第三方提供的庫名字libtest.so,那麼我們只要把lib

iOS 使用 Xcode8 制作動態靜態

三方 不想 -1 有關 module user pub nes 也有   在使用第三方 SDK 時,經常遇到他們提供的僅僅只有一個動態或靜態庫,並不能獲取源碼。使用動態庫 FrameWork 或 靜態庫 Lib,可以滿足不想把核心代碼的具體實現向使用者展示,又能避免其他人錯

Xcode 動態Framework 安裝路徑設置

介紹 同時 使用 加載 and install .com table 插件 使用Xcode開發動態庫及Framework時,需要為其設置Install path。在設置Install path時,可能會使用到以下幾個路徑: 1)絕對路徑:

如何編譯靜態將多個.a靜態合併成一個.a靜態

所使用的命令為ar 1 將所有的.a庫解壓成.o檔案ar x xx.a 2 將所有的.o 檔案合併成.aar rcs xx.b *.o 3 編譯.a 靜態庫 1)生成對應的.o 檔案 gcc -c a.c b.c 2)使用ar命令合成靜態庫 ar crs libjson.a *.o 3) 檢視編譯庫

Linux下動態(.so)和靜態(.a) 的區別 Linux下動態(.so)和靜態(.a) 的區別 動態(.so)連結靜態(.a)的情況總結

Linux下動態庫(.so)和靜態庫(.a) 的區別   靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。編譯之後程式檔案大,但載入快,隔離性也好。 動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。多個

linux編譯動態之-fPIC

在生成動態庫時,常常習慣性的加上fPIC選項,fPIC有什麼作用和意義,加不加有什麼區別,這裡做下小結: fPIC的全稱是 Position Independent Code, 用於生成位置無關程式碼。什麼是位置無關程式碼,個人理解是程式碼無絕對跳轉,跳轉都為相對跳轉。

Linux編譯動態和gdb除錯命令

Linux編譯動態庫和gdb除錯命令TOC IPC命令: 拷貝到當前目錄: cp …/day01/cleanipc . 清除ipc命令: cleanipc zhidao101 all 檢視網路連線: netstat -an | grep 8001 檢視使用者程序: ps -u

eclipse封裝動態連結動態

封裝動態庫 (1)建立Shared Library 工程 建立工程new->project->C Project->Shared Library->Empty Project,之後選擇Linux GCC ,輸入工程名MeLib,最後點選F

【Linux】Linux下MIPS平臺交叉編譯FFmpeg 使用擷取視訊中的某一幀

一.Linux下MIPS平臺交叉編譯FFmpeg庫: 1.下載ffmpeg庫的原始碼 (http://sourceforge.net/project/showfiles.php?group_id=205275&package_id=248632): [[email

Mac OS 下手動編譯靜態Xcode中使用該靜態的例子(一)

第一部分 Mac OS 下建立靜態庫 前言 眾所周知,Mac OS實際上是基於UNIX來編寫的,因此它保留了眾多的UNIX原有的特性,就靜態庫而言,仍舊以libXXXX.a來命名。要編譯Mac下的靜態庫,方法有很多,如使用Xcode的建立和編譯,也可以直接使用命令列(可結合

linux編譯動態之fPIC

今天在用g++編譯程式碼時,提示說.rdata錯誤,然後網上找了一堆資料,最後明白了一個要重新編譯對應的連結庫。 在生成動態庫時,常常習慣性的加上fPIC選項,fPIC有什麼作用和意義,加不加有什麼區別,這裡做下小結: fPIC的全稱是 Position Indepe

linux動態靜態的製作 和makefile 的簡單編寫

一.庫什麼是庫,簡單的可以說是可執行程式碼的二進位制形式,能夠被作業系統載入記憶體執行。作業系統的不同,二者的庫也是不相容的,如windows與linux.庫又分為靜態庫和動態庫,動態庫又稱為共享庫。linux下靜態庫(.a)檔案,動態庫(.so)檔案。主要存放函式庫的路徑有

《CMake實踐》筆記三:構建靜態動態 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建 讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。 本節的任務: 1、建立一個靜態庫和動態庫,提供HelloFunc函式供