只編譯不鏈接
gcc中,只編譯不鏈接的參數(shù)為-c墩弯。
編寫一個最簡單的hello world程序吩跋。
// filename hello.c
#include<stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
編譯一下:
gcc -c hello.c
得到 hello.o 文件。.o是object文件的意思渔工。不可以執(zhí)行锌钮。
用-o編譯鏈接一下:
gcc -o hello hello.c
./hello
成功運行,最后使用 ldd
命令查看hello依賴的動態(tài)庫引矩。
你也可以使用--static命令把這些庫全部靜態(tài)鏈接進來梁丘,靜態(tài)鏈接進來的會巨大無比:
編譯鏈接靜態(tài)庫
我們舉一個簡單的例子進行演示。子函數(shù)分別實現(xiàn)加減和乘除的功能旺韭,主函數(shù)調(diào)用這些函數(shù)氛谜。
編譯靜態(tài)庫
- 先寫一下實現(xiàn)加減功能的子函數(shù)。主函數(shù)要調(diào)用另一個c文件里面的函數(shù)区端,一般是通過共同包含同一個.h文件實現(xiàn)的值漫。
// filename add_minus.h
#ifndef __ADD_MINUS_H__
#define __ADD_MINUS_H__
int add(int a, int b);
int minus(int a, int b);
#endif /*__ADD_MINUS_H__*/
// filename add_minus.c
#include"add_minus.h"
int add(int a, int b)
{
return a+b;
}
int minus(int a, int b)
{
return a-b;
}
- 主函數(shù):
#include<stdio.h>
#include"add_minus.h"
int main()
{
printf("hello\n");
printf("%d\n",add(1,2));
printf("%d\n",minus(1,2));
return 0;
}
- 編譯靜態(tài)庫
假設(shè)我們需要把 add_minus.o 里面包含的 add 和 minus 編譯為靜態(tài)庫,只需要對.o文件執(zhí)行以下命令:
ar rc libadd_minus.a add_minus.o
- 外傳
各自編譯一下织盼,最后鏈接
(這只是個小插曲杨何,說明多個.o文件只需要鏈接一下就可以生成可執(zhí)行文件)
gcc -c main.c
gcc -c add_minus.c
gcc -o main main.o add_minus.o
./main
鏈接靜態(tài)庫
上節(jié)的1~3已經(jīng)得到了libadd_minus.a和main.o文件,這一步需要把這兩個文件鏈接起來
gcc -o main2 main.o -L./ -ladd_minus
說明1:-L./表明庫文件位置在當前文件夾
說明2: -ladd_minus 表示鏈接 libadd_minus.a 文件,使用“-l”參數(shù)時,前綴“l(fā)ib”和后綴“.a”是需要省略的沥邻。
編譯鏈接動態(tài)庫
編譯動態(tài)庫
- 先寫一下實現(xiàn)乘除功能的子函數(shù)危虱,其余同上。
// filename multi_div.h
#ifndef __MULTI_DIV_H__
#define __MULTI_DIV_H__
int multi(int a, int b);
int div(int a, int b);
#endif /*__MULTI_DIV_H__*/
// filename multi_div.c
#include "multi_div.h"
int multi(int a, int b)
{
return a*b;
}
int div(int a, int b)
{
return a/b;
}
- 主函數(shù):
#include <stdio.h>
#include "add_minus.h"
#include "multi_div.h"
int main(void)
{
int rst;
printf("Hello Cacu!\n");
rst = add(3,2);
printf("3 + 2 = %d\n",rst);
rst = minus(3,2);
printf("3 - 2 = %d\n",rst);
rst = multi(3,2);
printf("3 * 2 = %d\n",rst);
rst = div(6,2);
printf("6 / 2 = %d\n",rst);
return 0;
}
- 編譯靜態(tài)庫
假設(shè)我們需要把 multi_div.o 里面包含的 multi 和 div 編譯為靜態(tài)庫唐全,需要使用gcc:
gcc multi_div.c -fPIC -shared -o libmulti_div.so
鏈接動態(tài)庫
- 在外部告訴程序埃跷,動態(tài)庫在哪里
有兩種方法:
- 將 libmulti_div.so copy到/lib/ 或 /usr/lib/ 下
這個方法對很多軟件都要使用的庫比較友好 - 在 LD_LIBRARY_PATH 變量中指定庫文件路徑
這個一般就是臨時弄一下。用法:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/yourpath
- 編譯鏈接
gcc -o main4 main.o -L./ -ladd_minus -lmulti_div