折騰了一天編譯、動態庫的問題,整理一下(參考:
現有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 可以在程式執行時被載入 鏈結 進來。使用動態鏈結庫的優點是 程式的可執行檔案更小,便於程式的模組化以及更新,同時,有效記憶體的使用效率更高。如果想建立乙個...