編譯生成動態庫 鏈結動態庫生成可執行檔案

2021-09-29 20:12:07 字數 4076 閱讀 3078

折騰了一天編譯、動態庫的問題,整理一下(參考:

現有4個檔案:

head.h--庫標頭檔案

source1.cc--庫原始檔1

source2.cc--庫原始檔2

#include "stdio.h"

#include "stdlib.h"

#include "head.h"

int main()

庫標頭檔案head.h裡是庫原始檔1 source1.cc、庫原始檔2 source2.cc裡方法的宣告:

// head.h

void source1();

void source2();

庫原始檔1 source1.cc裡定義了source1()函式:

// source1.cc

#include "stdio.h"

#include "stdlib.h"

#include "head.h"

void source1()

庫原始檔1 source1.cc裡定義了source1()函式:

// source2.cc

#include "stdio.h"

#include "stdlib.h"

#include "head.h"

void source2()

然後,重點來了!

想要應用程式正確執行,有三種方法:

source1

source2

二、編譯庫的2個原始檔source1.cc、source2.cc為兩個目標檔案source1.o,source2.o:

zhan@virtualbox:~/home/test_lib$ gcc source1.cc -c

zhan@virtualbox:~/home/test_lib$ ls

zhan@virtualbox:~/home/test_lib$ gcc source2.cc -c

zhan@virtualbox:~/home/test_lib$ ls

然後用ar命令將source1.o、source2.o建立成靜態庫檔案,這裡有兩種方案:

1、第一種是分別建立兩個靜態庫檔案 libsource1.a、libsource2.a,

zhan@virtualbox:~/home/test_lib$ ar -cr libsource1.a source1.o

zhan@virtualbox:~/home/test_lib$ ar -cr libsource2.a source2.o

zhan@virtualbox:~/home/test_lib$ ls

head.h libsource2.a source1.o source2.o

zhan@virtualbox:~/home/test_lib$ ls

source1

source2

2、第二種是將兩個目標檔案source1.o,source2.o合併建立成乙個靜態庫檔案 libsource.a:

zhan@virtualbox:~/home/test_lib$ ar -cr libsource.a source1.o source2.o

zhan@virtualbox:~/home/test_lib$ ls

source1

source2

三、編譯庫的2個原始檔source1.cc、source2.cc為乙個動態庫檔案source.so:

zhan@virtualbox:~/home/test_lib$ gcc source1.cc source2.cc -fpic -shared -o libsource.so

zhan@virtualbox:~/home/test_lib$ ls

zhan@virtualbox:~/home/test_lib$ ls

linux-vdso.so.1 => (0x00007ffd54b8a000)

libsource.so => not found

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbe0a005000)

/lib64/ld-linux-x86-64.so.2 (0x0000557f1caba000)

發現找不到庫檔案,此時有多種解決方案:

zhan@virtualbox:~/home/test_lib$ sudo cp libsource.so  /usr/lib

linux-vdso.so.1 => (0x00007ffc7c100000)

libsource.so => /usr/lib/libsource.so (0x00007fc1f5106000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc1f4d3d000)

/lib64/ld-linux-x86-64.so.2 (0x000055e2451c0000)

source1

source2

2、將libsource.so庫檔案所在目錄新增到/etc/ld.so.conf檔案中:

zhan@virtualbox:~/home/test_lib$ sudo vim /etc/ld.so.conf

include /etc/ld.so.conf.d/*.conf

/home/test_lib

zhan@virtualbox:~/home/test_lib$ sudo ldconfig

linux-vdso.so.1 => (0x00007fffa93dc000)

libsource.so => /home/test_lib/libsource.so (0x00007fada87ab000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fada83c9000)

/lib64/ld-linux-x86-64.so.2 (0x00005643a0cbf000)

source1

source2

3、用export命令export乙個指向libsource.so庫檔案所在目錄的全域性變數ld_library_path, 然後執行程式的時候就會去這個目錄中找共享庫. (建議該方法只用於臨時除錯

zhan@virtualbox:~/home/test_lib$ export ld_library_path=/home/test_lib:$ld_library_path

linux-vdso.so.1 => (0x00007fffa93dc000)

libsource.so => /home/test_lib/libsource.so (0x00007fada87ab000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fada83c9000)

/lib64/ld-linux-x86-64.so.2 (0x00005643a0cbf000)

source1

source2

ps:

也可以將二中的兩個目標檔案source1.o,source2.o合成為動態庫檔案libsource.so

zhan@virtualbox:~/home/test_lib$ ar -rc -o libsource.so source1.o source2.o

zhan@virtualbox:~/home/test_lib$ ls

linux-vdso.so.1 => (0x00007ffcc5c9a000)

libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f926e42b000)

/lib64/ld-linux-x86-64.so.2 (0x0000560f56a62000)

source1

source2

生成動態鏈結庫

fpic pic就是position independent code pic使.so檔案的 段變為真正意義上的共享 如果不加 fpic,則載入.so檔案的 段時,段引用的資料物件需要重定位,重定位會修改 段的內容,這就造成每個使用這個.so檔案 段的程序在核心裡都會生成這個.so檔案 段的copy...

gcc動態庫與動態庫生成和鏈結

一般是建立共享庫的命令如下 gcc fpic c foo.c o foo.o gcc fpic c bar.c o bar.o gcc shared foo.o bar.o o libz.so gcc main.c lz l.o main這樣生成的共享庫還差點意思,完整格式應該同時設定共享庫的son...

GCC 生成動態鏈結庫

linux 下動態鏈結庫 shared object file,共享物件檔案 的檔案字尾為.so,它是一種特殊的目標檔案 object file 可以在程式執行時被載入 鏈結 進來。使用動態鏈結庫的優點是 程式的可執行檔案更小,便於程式的模組化以及更新,同時,有效記憶體的使用效率更高。如果想建立乙個...