gcc編譯 同時包含靜態庫和共享庫

2021-06-10 12:13:42 字數 2640 閱讀 9804

hello.h標頭檔案

#ifndef hello_h

#define hello_h

void print_hello();

#endif

hello.c原始檔

#include "hello.h"

#include int main(int argc,char *argv)

[test@hadoop hello]$ ls

hello.c hello.h main.c

[test@hadoop hello]$ gcc -c hello.c

[test@hadoop hello]$ ar crs libhello.a hello.o

[test@hadoop hello]$ gcc -shared -fpic -o libhello.so hello.o

[test@hadoop hello]$ ls

hello.c hello.h hello.o libhello.a libhello.so main.c

[test@hadoop hello]$ gcc main.c -o main -l. -lhello -i.

[test@hadoop hello]$ ldd main

linux-gate.so.1 => (0x00a11000)

libhello.so => /home/test/programs/c/hello/libhello.so (0x0024b000)

libc.so.6 => /lib/libc.so.6 (0x0024d000)

/lib/ld-linux.so.2 (0x0011f000)

看的出, gcc選擇的是libhello.so, 即共享庫優先

[test@hadoop hello]$ ls

hello.c hello.h hello.o libhello.a libhello.so main.c

[test@hadoop hello]$ gcc -static main.c -o main -l. -lhello -i. #使用-static 引數阻止鏈結共享庫

[test@hadoop hello]$ ls

hello.c hello.h hello.o libhello.a libhello.so main main.c

[test@hadoop hello]$ ldd main

not a dynamic executable

看的出, gcc此次選擇的是libhello.a, 即靜態庫

*********hello.h**同上******************

*********hello.c**同上******************

calculate.h標頭檔案

#ifndef calculate_h

#define calculate_h

int add(int a,int b);

#endif

calculate.c原始檔

#include "calculate.h"

int add(int a,int b)

新的測試檔案main.c

#include "hello.h"

#include "calculate.h"

#include int main(int argc,char *argv)

[test@hadoop hello]$ gcc -c calculate.c

[test@hadoop hello]$ ar crs libcalculate.a calculate.o

[test@hadoop hello]$ ls

calculate.c  calculate.h  calculate.o  hello.c  hello.h  libcalculate.a  libhello.so  main.c

[test@hadoop hello]$ gcc main.c -o main -l. -lhello -lcalculate -i.

[test@hadoop hello]$ ls

calculate.c calculate.h calculate.o hello.c hello.h libcalculate.a libhello.so main main.c

[test@hadoop hello]$ ldd main

linux-gate.so.1 => (0x00769000)

libhello.so => /home/test/programs/c/hello/libhello.so (0x00c6d000)

libc.so.6 => /lib/libc.so.6 (0x0013e000)

/lib/ld-linux.so.2 (0x0011f000)

看得出, 我們成功了:)

gcc編譯靜態庫和動態庫

一 動態鏈結庫 1.建立hello.so動態庫 cpp view plain copy print?include voidhello 編譯 gcc fpic shared hello.c o libhello.so include void hello 編譯 gcc fpic shared hel...

gcc編譯流程和 gcc靜態庫和動態庫 二

linux gcc常用命令 1示例程式如下 複製 include int main void 複製 這個程式,一步到位的編譯指令是 gcc test.c o test 實質上,上述編譯過程是分為四個階段進行的,即預處理 也稱預編譯,preprocessing 編譯 compilation 彙編 as...

GCC執行過程 gcc編譯靜態庫和動態庫

1 預處理階段 這個階段主要是處理原始檔中的 ifdef include和 define命令 命令 gcc e c o i 2 編譯階段 輸入的是中間檔案 i,編譯後生成組合語言檔案 s 命令 gcc s i o s 3 彙編階段 輸入的是彙編檔案 s,輸出的轉換生成的機器語言 o 命令 gcc c...