1. 程式人生 > >Linux下gcc生成和使用靜態庫和動態庫詳解

Linux下gcc生成和使用靜態庫和動態庫詳解

一、基本概念

1.1什麼是庫

在windows平臺和linux平臺下都大量存在著庫。
本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。
由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二進位制是不相容的。
本文僅限於介紹linux下的庫。

1.2庫的種類

linux下的庫有兩種:靜態庫和共享庫(動態庫)。
二者的不同點在於程式碼被載入的時刻不同。
靜態庫的程式碼在編譯過程中已經被載入可執行程式,因此體積較大。
共享庫的程式碼是在可執行程式執行時才載入記憶體的,在編譯過程中僅簡單的引用,因此程式碼體積較小。

1.3庫存在的意義

庫是別人寫好的現有的,成熟的,可以複用的程式碼,你可以使用但要記得遵守許可協議。
現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的程式碼都從零開始,因此庫的存在意義非同尋常。
共享庫的好處是,不同的應用程式如果呼叫相同的庫,那麼在記憶體裡只需要有一份該共享庫的例項。

1.4庫檔案是如何產生的在linux下

靜態庫的字尾是.a,它的產生分兩步

  1. 由原始檔編譯生成一堆.o,每個.o裡都包含這個編譯單元的符號表
  2. ar命令將很多.o轉換成.a,成為靜態庫
    動態庫的字尾是.so,它由gcc加特定引數編譯產生。
    具體方法參見後文例項。

1.5庫檔案是如何命名的,有沒有什麼規範

在linux下,庫檔案一般放在/usr/lib和/lib下,
靜態庫的名字一般為libxxxx.a,其中xxxx是該lib的名稱
動態庫的名字一般為libxxxx.so.major.minor,xxxx是該lib的名稱,major是主版本號, minor是副版本號

1.6如何知道一個可執行程式依賴哪些庫

ldd命令可以檢視一個可執行程式依賴的共享庫,
例如$ ldd /bin/lnlibc.so.6
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依賴於libc庫和ld-linux庫

1.7可執行程式在執行的時候如何定位共享庫檔案

當系統載入可執行程式碼時候,能夠知道其所依賴的庫的名字,但是還需要知道絕對路徑。
此時就需要系統動態載入器(dynamic linker/loader)
對於elf格式的可執行程式,是由ld-linux.so*來完成的,它先後搜尋elf檔案的 DT_RPATH段—環境變數LD_LIBRARY_PATH—/etc/ld.so.cache檔案列表—/lib/,/usr/lib目錄找到庫檔案後將其載入記憶體
如:export LD_LIBRARY_PATH='pwd'


將當前檔案目錄新增為共享目錄

1.8在新安裝一個庫之後如何讓系統能夠找到他

如果安裝在/lib或者/usr/lib下,那麼ld預設能夠找到,無需其他操作。
如果安裝在其他目錄,需要將其新增到/etc/ld.so.cache檔案中,步驟如下
1.編輯/etc/ld.so.conf檔案,加入庫檔案所在目錄的路徑
2.執行ldconfig 目錄名字,該命令會重建/etc/ld.so.cache檔案

二、用gcc生成靜態和動態連結庫的示例

我們通常把一些公用函式製作成函式庫,供其它程式使用。
函式庫分為靜態庫和動態庫兩種。

靜態庫在程式編譯時會被連線到目的碼中,程式執行時將不再需要該靜態庫。

動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。

本文主要通過舉例來說明在Linux中如何建立靜態庫和動態庫,以及使用它們。

為了便於闡述,我們先做一部分準備工作。

2.1準備好測試程式碼

hello.h(見程式1)為該函式庫的標頭檔案。

hello.c(見程式2)是函式庫的源程式,其中包含公用函式hello,該函式將在螢幕上輸出"Hello XXX!"。

main.c(見程式3)為測試庫檔案的主程式,在主程式中呼叫了公用函式hello。

測試機器環境:gcc version 4.8.4 ;ubuntu14.04.3

三個程式放在資料夾~/testso
程式1: hello.h

#ifndef HELLO_H 
#define HELLO_H 
    void hello(const char *name); 
#endif

程式2:hello.c

#include <stdio.h> 
void hello(const char *name) { 
    printf("Hello %s!\n", name); 
}

程式3:main.c

#include  "hello.h"
int main() 
 { 
     hello("everyone"); 
     return 0; 
 }

2.2問題的提出

注意:這個時候,我們編譯好的hello.o是無法通過gcc –o 編譯的,這個道理非常簡單,
hello.c是一個沒有main函式的.c程式,因此不夠成一個完整的程式,如果使用gcc –o 編譯並連線它,GCC將報錯。
無論靜態庫,還是動態庫,都是由.o檔案建立的。因此,我們必須將源程式hello.c通過gcc先編譯成.o檔案。
這個時候我們有三種思路:
1) 通過編譯多個原始檔,直接將目的碼合成一個.o檔案。
2) 通過建立靜態連結庫libmyhello.a,使得main函式呼叫hello函式時可呼叫靜態連結庫。
3) 通過建立動態連結庫libmyhello.so,使得main函式呼叫hello函式時可呼叫靜態連結庫。

2.3思路一:編譯多個原始檔

在系統提示符下鍵入以下命令得到hello.o檔案。
gcc -c hello.c
為什麼不使用gcc –o hello hello.c這個道理我們之前已經說了,使用-c是什麼意思呢?這涉及到gcc 編譯選項的常識。

gcc –o是將.c原始檔編譯成為一個可執行的二進位制程式碼(-o選項其實是制定輸出檔案檔名,如果不加-c選項,gcc預設會編譯連線生成可執行檔案,檔案的名稱有-o選項指定),這包括呼叫作為GCC內的一部分真正的C編譯器(ccl),以及呼叫GNU C編譯器的輸出中實際可執行程式碼的外部GNU彙編器(as)和聯結器工具(ld)。
gcc –c是使用GNU彙編器將原始檔轉化為目的碼之後就結束,在這種情況下,只調用了C編譯器(ccl)和彙編器(as),而聯結器(ld)並沒有被執行,所以輸出的目標檔案不會包含作為Linux程式在被裝載和執行時所必須的包含資訊,但它可以在以後被連線到一個程式。
我們執行ls命令看看是否生存了hello.o檔案。
$ ls
hello.c hello.h hello.o main.c
在ls命令結果中,我們看到了hello.o檔案,本步操作完成。

同理編譯main
$gcc –c main.c

將兩個檔案連結成一個.o檔案。
$gcc hello.o main.o -o hello

執行
$ ./hello

Hello everyone!

完成^ ^!

2.4思路二:靜態連結庫

下面我們先來看看如何建立靜態庫,以及使用它。

靜態庫檔名的命名規範是以lib為字首,緊接著跟靜態庫名,副檔名為.a。例如:我們將建立的靜態庫名為myhello,則靜態庫檔名就是libmyhello.a。在建立和使用靜態庫時,需要注意這點。建立靜態庫用ar命令。

在系統提示符下鍵入以下命令將建立靜態庫檔案libmyhello.a。
$ ar rcs libmyhello.a hello.o

我們同樣執行ls命令檢視結果:
$ ls
hello.c hello.h hello.o libmyhello.a main.c

ls命令結果中有libmyhello.a。

靜態庫製作完了,如何使用它內部的函式呢?只需要在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明靜態庫名,gcc將會從靜態庫中將公用函式連線到目標檔案中。注意,gcc會在靜態庫名前加上字首lib,然後追加副檔名.a得到的靜態庫檔名來查詢靜態庫檔案,因此,我們在寫需要連線的庫時,只寫名字就可以,如libmyhello.a的庫,只寫:-lmyhello

在程式3:main.c中,我們包含了靜態庫的標頭檔案hello.h,然後在主程式main中直接呼叫公用函式hello。下面先生成目標程式hello,然後執行hello程式看看結果如何。

$ gcc -o hello main.c -static -L. -lmyhello
$ ./hello
Hello everyone!

我們刪除靜態庫檔案試試公用函式hello是否真的連線到目標檔案 hello中了。
$ rm libmyhello.a
$ ./hello
Hello everyone!

程式照常執行,靜態庫中的公用函式已經連線到目標檔案中了。
靜態連結庫的一個缺點是,如果我們同時運行了許多程式,並且它們使用了同一個庫函式,這樣,在記憶體中會大量拷貝同一庫函式。這樣,就會浪費很多珍貴的記憶體和儲存空間。使用了共享連結庫的Linux就可以避免這個問題。

共享函式庫和靜態函式在同一個地方,只是字尾有所不同。比如,在一個典型的Linux系統,標準的共享數序函式庫是/usr/lib/libm.so。

當一個程式使用共享函式庫時,在連線階段並不把函式程式碼連線進來,而只是連結函式的一個引用。當最終的函式匯入記憶體開始真正執行時,函式引用被解析,共享函式庫的程式碼才真正匯入到記憶體中。這樣,共享連結庫的函式就可以被許多程式同時共享,並且只需儲存一次就可以了。共享函式庫的另一個優點是,它可以獨立更新,與呼叫它的函式毫不影響。

2.5思路三、動態連結庫(共享函式庫)

我們繼續看看如何在Linux中建立動態庫。我們還是從.o檔案開始。

動態庫檔名命名規範和靜態庫檔名命名規範類似,也是在動態庫名增加字首lib,但其副檔名為.so。例如:我們將建立的動態庫名為myhello,則動態庫檔名就是libmyhello.so。用gcc來建立動態庫。

在系統提示符下鍵入以下命令,得到動態庫檔案libmyhello.so
$ gcc -shared -fPIC -c hello.c 注:chenjim新增,原文沒有,下一行會報錯
$ gcc -shared -fPIC -o libmyhello.so hello.o

“PIC”命令列標記告訴GCC產生的程式碼不要包含對函式和變數具體記憶體位置的引用,這是因為現在還無法知道使用該訊息程式碼的應用程式會將它連線到哪一段記憶體地址空間。這樣編譯出的hello.o可以被用於建立共享連結庫。建立共享連結庫只需要用GCC的”-shared”標記即可。

我們照樣使用ls命令看看動態庫檔案是否生成。
$ ls
hello.cpp hello.h hello.o libmyhello.so main.cpp
呼叫動態連結庫編譯目標檔案。

在程式中使用動態庫和使用靜態庫完全一樣,也是在使用到這些公用函式的源程式中包含這些公用函式的原型宣告,然後在用gcc命令生成目標檔案時指明動態庫名進行編譯。我們先執行gcc命令生成目標檔案,再執行它看看結果。

如果直接用如下方法進行編譯,並連線:
$ gcc -o hello main.c -L. -lmyhello

$ ./hello
./hello: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

錯誤提示,找不到動態庫檔案libmyhello.so。程式在執行時,會查詢需要的動態庫檔案,順序參考後文介紹。若找到,則載入動態庫,否則將提示類似上述錯誤而終止程式執行。有多種方法可以解決,
(1)我們將檔案 libmyhello.so複製到目錄/usr/lib中,再試試。
$ sudo mv libmyhello.so /usr/lib
(2)既然聯結器會搜尋LD_LIBRARY_PATH所指定的目錄,那麼我們可以將這個環境變數設定成當前目錄:
export LD_LIBRARY_PATH=$(pwd)
(3)sudo ldconfig ~/testso
注: 當用戶在某個目錄下面建立或拷貝了一個動態連結庫,若想使其被系統共享,可以執行一下"ldconfig 目錄名"這個命令。此命令的功能在於讓ldconfig將指定目錄下的動態連結庫被系統共享起來,意即:在快取檔案/etc/ld.so.cache中追加進指定目錄下的共享庫.本例讓系統共享了~/tests目錄下的動態連結庫。

下面的這個錯誤我沒有遇到,不過也記錄下,給遇到的人:
{ 這步後我沒有成功,報錯內容如下:/hello: error while loading shared libraries: /usr/lib/libmyhello.so: cannot restore segment prot after reloc: Permission denied
google了一下,發現是SELinux搞的鬼,解決辦法有兩個:

  1. chcon -t texrel_shlib_t /usr/lib/libmyhello.so
    (chcon -t texrel_shlib_t “你不能share的庫的絕對路徑”)
  2. $vi /etc/sysconfig/selinux file
    或者用
    $gedit /etc/sysconfig/selinux file
    修改SELINUX=disabled
    重啟

這也進一步說明了動態庫在程式執行時是需要的。
可以檢視程式執行時呼叫動態庫的過程:
$ ldd hello
可以看到它是如何呼叫動態庫中的函式的。
linux-vdso.so.1 => (0x00007fffe8f9b000)
libmyhello.so => /home/chenjw/testso/libmyhello.so (0x00007fbe807d5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe80410000)
/lib64/ld-linux-x86-64.so.2 (0x000055dc016c2000)

原文中說,使用靜態庫和使用動態庫編譯成目標程式使用的gcc命令完全一樣,
可能因為我們的環境不一樣,上文我多加了一行編譯命令gcc -shared -fPIC -c hello.c
所以原文的驗證,那當靜態庫和動態庫同名時,gcc命令會使用哪個庫檔案呢?
在我的環境沒有意義,add by chenjim。

2.6編譯引數解析

最主要的是GCC命令列的一個選項:

  • -shared 該選項指定生成動態連線庫(讓聯結器生成T型別的匯出符號表,有時候也生成弱連線W型別的匯出符號),不用該標誌外部程式無法連線。相當於一個可執行檔案
  • l -fPIC:表示編譯為位置獨立的程式碼,不用此選項的話編譯後的程式碼是位置相關的所以動態載入時是通過程式碼拷貝的方式來滿足不同程序的需要,而不能達到真正程式碼段共享的目的。
  • l -L.:表示要連線的庫在當前目錄中
  • l -ltest:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱
  • l LD_LIBRARY_PATH:這個環境變數指示動態聯結器可以裝載動態庫的路徑。
  • l 當然如果有root許可權的話,可以修改/etc/ld.so.conf檔案,然後呼叫 /sbin/ldconfig來達到同樣的目的,不過如果沒有root許可權,那麼只能採用輸出LD_LIBRARY_PATH的方法了。
    呼叫動態庫的時候有幾個問題會經常碰到,有時,明明已經將庫的標頭檔案所在目錄 通過 “-I” include進來了,庫所在檔案通過 “-L”引數引導,並指定了“-l”的庫名,但通過ldd命令察看時,就是死活找不到你指定連結的so檔案,這時你要作的就是通過修改 LD_LIBRARY_PATH或者/etc/ld.so.conf檔案來指定動態庫的目錄。通常這樣做就可以解決庫無法連結的問題了。

2.7 靜態庫連結時搜尋路徑順序:

  1. ld會去找GCC命令中的引數-L

  2. 再找gcc的環境變數LIBRARY_PATH

  3. 再找內定目錄 /lib /usr/lib /usr/local/lib 這是當初compile gcc時寫在程式內的

2.8動態連結時、執行時搜尋路徑順序:

  1. 編譯目的碼時指定的動態庫搜尋路徑;

  2. 環境變數LD_LIBRARY_PATH指定的動態庫搜尋路徑;

  3. 配置檔案/etc/ld.so.conf中指定的動態庫搜尋路徑;

  4. 預設的動態庫搜尋路徑/lib;

  5. 預設的動態庫搜尋路徑/usr/lib。

2.9 有關環境變數:

LIBRARY_PATH環境變數:指定程式靜態連結庫檔案搜尋路徑

LD_LIBRARY_PATH環境變數:指定程式動態連結庫檔案搜尋路徑

三、linux開發之資料夾和應用程式

1. 應用程式(Applications)

應用程式通常都有固定的資料夾,系統通用程式放在/usr/bin,日後系統管理員在本地計算機安裝的程式通常放在/usr/local/bin或者/opt資料夾下。除了系統程式外,大部分個人用到的程式都放在/usr/local下,所以保持/usr的整潔十分重要。當升級或者重灌系統的時候,只要把/usr/local的程式備份一下就可以了。

一些其他的程式有自己特定的資料夾,比如X Window系統,通常安裝在/usr/X11中,或者/usr/X11R6。GNU的編譯器GCC,通常放置在/usr/bin或者/usr/local/bin中,不同的Linux版本可能位置稍有不同。

2. 標頭檔案(Head Files)

在C語言和其他語言中,標頭檔案聲明瞭系統函式和庫函式,並且定義了一些常量。對於C語言,標頭檔案基本上散落於/usr/include和它的子資料夾下。其他的程式語言的庫函式分佈在編譯器定義的地方,比如在一些Linux版本中,X Window系統庫函式分佈在/usr/include/X11,GNU C++的庫函式分佈在/usr/include/g++。這些系統庫函式的位置對於編譯器來說都是“標準位置”,即編譯器能夠自動搜尋這些位置。

如果想引用位於標準位置之外的標頭檔案,我們需要在呼叫編譯器的時候加上-I標誌,來顯式的說明標頭檔案所在資料夾。比如,
$ gcc -I/usr/openwin/include hello.c

會告訴編譯器除了標準位置外,還要去/usr/openwin/include看看有沒有所需的標頭檔案。詳細情況見編譯器的使用手冊(man gcc)。

3. 庫函式(Library Files)

庫函式就是函式的倉庫,它們都經過編譯,重用性不錯。通常,庫函式相互合作,來完成特定的任務。比如操控螢幕的庫函式(cursers和ncursers庫函式),資料庫讀取庫函式(dbm庫函式)等。

系統呼叫的標準庫函式一般位於/lib以及/usr/lib。C編譯器(精確點說,聯結器)需要知道庫函式的位置。預設情況下,它只搜尋標準C庫函式。

庫函式檔案通常開頭字母是lib。後面的部分標示庫函式的用途(比如C庫函式用c標識, 數學庫函式用m標示),小數點後的字尾表明庫函式的型別:

.a 指靜態連結庫
.so 指動態連結庫
去/usr/lib看一下,你會發現,庫函式都有動態和靜態兩個版本。

與標頭檔案一樣,庫函式通常放在標準位置,但我們也可以通過-L識別符號,來新增新的搜尋資料夾,-l指定特定的庫函式檔案。比如
$ gcc -o x11fred -L/usr/openwin/lib x11fred.c -lX11
上述命令就會在編譯期間,連結位於/usr/openwin/lib資料夾下的libX11函式庫,編譯生成x11fred。

靜態連結庫(Static Libraries)

最簡單的函式庫就是一些函式的簡單集合。呼叫庫函式中的函式時,需要在呼叫函式中include定義庫函式的標頭檔案。我們用-l選項新增標準函式庫之外的函式庫。

相關推薦

Linuxgcc生成使用靜態動態

一、基本概念 1.1什麼是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二

linuxgcc預設搜尋標頭檔案及檔案的路徑

linux下gcc預設搜尋標頭檔案及庫檔案的路徑 一、標頭檔案gcc 在編譯時如何去尋找所需要的標頭檔案:※所以header file的搜尋會從-I開始※然後找gcc的環境變數 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_

linux使用eclipse編譯、連結、動態的學習筆記

 一、建立動態連結庫     1、建立工程new->project->c++ project選擇Shared Library->Empty Project.輸入工程名MySharedLib,點選finish,完成工程的建立。   2. 庫程式碼的

Linux用戶組、文件權限

目錄 管理權限 權限不足 日期 查看 add 綜合案例 天然 width 在linux中的每個用戶必須屬於一個組,不能獨立於組外。在linux中每個文件有所有者、所在組、其它組的概念 - 所有者 - 所在組 - 其它組 - 改變用戶所在的組 所有者 一般為文件的創建者,

linux安裝ab壓力測試工具及ab命令

yum -y install httpd-tools ab -v 檢視ab版本 ab –help ab -n1000 -c 10 http://www.xxxx.com/ 以上命令-n訪問1000次, -c併發10個 ab壓力測試返回報文內容詳解: Server Soft

Linux基於Hadoop的大資料環境搭建步驟(Hadoop,Hive,Zookeeper,Kafka,Flume,Hbase,Spark等安裝與配置)

Linux下基於Hadoop的大資料環境搭建步驟詳解(Hadoop,Hive,Zookeeper,Kafka,Flume,Hbase,Spark等安裝與配置) 系統說明 搭建步驟詳述 一、節點基礎配置 二、H

linux通過mount掛載iscsi、ntfs、nfs

通常伺服器本機自帶磁碟空間有限,都需要額外載入磁碟,可以採用mount方式把遠端的共享儲存磁碟載入進來,目前用過的有iscsi、ntfs、nfs三種類型一,mount掛載iscsi型別1,查詢下準備掛載的磁碟或者儲存器[[email protected] /]# i

LinuxPython腳本自啟動與定時任務

文件 自啟 權限 crontab 自動運行 command 任務 bin www 這篇文章主要給大家介紹了關於Linux下Python腳本自啟動與定時任務的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用python具有一定的參考學習價值。前言 最近同事問了一

Linuxgcc編譯器生成使用靜態動態學習筆記

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連結並拷貝到目的碼中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被拷貝到目的碼中,而是在程式執行時才被載入,因此在程式執行時還需要動態庫存在。本質上說庫是一

linux 編譯生成靜態動態

我們此處為了說明靜態庫和動態庫的編譯,會使用示例程式碼。建立  test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例程式碼,檔案命名不規範,理解意思即可 )。test.h (靜態庫標頭檔案)#ifndef _TEST_

Linux靜態動態的建立使用

Linux下靜態庫、動態庫的建立和使用 Linux庫檔名由:字首lib、庫名和字尾3部分組成,靜態庫通常以.a作為字尾,動態庫以.so作為字尾, Linux下把動態庫叫做共享庫,so即shared object的縮寫。 靜態庫是程式編譯連結時使用,動態庫是程式執行時使用。

Linux建立、檢視、提取修改靜態(*.a)

先說明一點,靜態庫檔案是由多個目標檔案打包而成的,在windows下靜態庫檔案的字尾是.lib,而在linux下靜態庫檔案的字尾是.a(a是archive的縮寫,也就是文件檔案)。   廢話少說,下面直接進入主題。   1.建立兩個c檔案:addition.c 和 mul

linux的共享動態靜態

1.什麼是庫 在windows平臺和linux平臺下都大量存在著庫。本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的本質不同,因此二者庫的二進位制是不相容的。 本文僅限於介紹linux下的庫。 2.庫的種類 linux

【領卓教育】Linux--靜態動態(共享) 區別、製作使用

1.概念和區別      靜態庫 :(1)libxxx.a ,程式在編譯時,將庫編譯 進可執行程式中!                     &nbs

Linuxgcc/g++、makecmake的區別

文字程式到可執行檔案生成無論在什麼平臺大致分為以下幾個部分:    1.用編輯器編寫原始碼,如.c檔案。    2.用編譯器編譯程式碼生成目標檔案,如.o。    3.用連結器連線目的碼生成可執行檔案,如.exe。    Linux平臺下,.o檔案一般是通過編譯的但還未連結的

linuxgcc版本的升級降級

                                       gcc版本的升降         在linux(Ubuntu)下做交叉編譯或者其他很多工時,經常需要改變編譯器的版本。這時候,我們可以通過下載編譯器的二進位制原始碼,自己編譯後安裝到系統。但是會

linuxgcc編譯 .c檔案生成動態連結 .so檔案,並測試呼叫該連結

簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc

Linuxgcc編譯生成動態連結*.so檔案並呼叫它

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡

linuxopenssl生成靜態

下載原始碼 原始碼編譯 解壓之後,進入原始碼目錄openssl-1.1.0f,執行如下命令。因為只需要編譯靜態庫,也沒有特殊要求,所以使用的編譯選項配置很簡單: ./config -fPIC no-shared make 其中,-fPIC:指示生成位置無關的

linux xdocreport 生成word pdf 亂碼(中文是空,或者方塊)

最近專案需要pdf列印,通過調研和網上搜索xdocreport,處理圖片和word,pdf無論是生成速度和記憶體消耗,比doc4j都要速度快,記憶體消耗小。開發一直在window下面,生成pdf正常,中文不會亂碼,部署到linux伺服器就各種問題。 解決方法: