一、動態(tài)編譯與靜態(tài)編譯
動態(tài)編譯使用的是動態(tài)庫文件進(jìn)行編譯,默認(rèn)使用的是動態(tài)編譯方法。
gcc hello.c -o hello
靜態(tài)編譯使用的是靜態(tài)庫文件進(jìn)行的編譯
gcc -static hello.c -o hello
靜態(tài)編譯要把靜態(tài)庫文件打包編譯到可執(zhí)行程序中,動態(tài)編譯不會把動態(tài)庫文件打包編譯到可執(zhí)行程序中,它們只是編譯鏈接關(guān)系。
二、制作靜態(tài)庫
首先看一個例子,有一下三個c語言文件,mylib.c、mylib.h、mytest.c。mylib.h做函數(shù)的聲明,mylib.c做函數(shù)的定義,mytest.c做功能的測試。
mylib.c
int max(int x,int y)
{
return x>y?x:y;
}
int min(int x,int y)
{
return x
mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
extern int max(int x,int y);
extern int min(int x,int y);
#endif
mytest.c
#include
#include "mylib.h"
int main(int argc,char *argv[])
{
int a=10,b=20,max_num,min_num;
max_num=max(a,b);
min_num=min(a,b);
printf("max_num=%d\\n",max_num);
printf("min_num=%d\\n",min_num);
return 0;
}
下面我們想讓mylib.c打包為一個庫文件。過程如下,首先我們讓想打包的文件生成.o文件
gcc -c mylib.c -o mylib.o
然后將這個.o文件做成一個靜態(tài)庫,注意:靜態(tài)庫起名的時候必須以lib開頭以.a結(jié)尾。
ar rc libmylib.a mylib.o
制作好靜態(tài)庫之后,我們可以編譯程序了,這時候就可以不使用mylib.c文件了。編譯程序有三種方法如下:
方法一
這幾個文件都在同一個目錄下面,就可以不用這么麻煩,直接使用下面的命令就可以完成編譯。
gcc -static mytest.c libmylib.a -o mytest
方法二
可以指定頭文件及庫文件路徑,比如我們可以將libmylib.a和mylib.h移動到/home/test文件夾下,那么可以使用的命令如下:
gcc -static mytest.c -o mytest -L/home/test -lmylib -I/home/test
下面對其中的參數(shù)做一些解釋:
- -L是指定庫文件的路徑
- -l是指定找哪個庫,指定的只要庫文件lib后面.a前面的部分
- -I是指定頭文件的路徑
方法三
可以將庫文件和頭文件存放到系統(tǒng)默認(rèn)指定的路徑下。庫文件默認(rèn)路徑是/lib或者是/usr/lib。頭文件默認(rèn)路徑是/usr/include。所以可以執(zhí)行下面兩條命令。
sudo mv libmylib.a /usr/lib
sudo mv mylib.h /usr/include
然后就可以執(zhí)行編譯程序命令。
gcc -static mytest.c -o mytest -lmylib
-l是指定的要找哪個庫。
三、制作動態(tài)庫
還是上面代碼的例子,生成一個mylib.c的動態(tài)庫文件。
1、首先是將要加入動態(tài)庫的源文件編譯為與位置無關(guān)的目標(biāo)文件。
gcc -fPIC -c mylib.c
這時候就會生成一個與位置無關(guān)的目標(biāo)文件,關(guān)于為什么會加上-fPIC的選項(xiàng),可以參考這個博客。
2、然后第二步是將第一步生成的目標(biāo)文件打包到動態(tài)庫文件 。
gcc -shared -o libmylib.so mylib.o
3、然后是動態(tài)庫鏈接生成可執(zhí)行文件
gcc mytest.c libmylib.so -o mytest
但是這時候執(zhí)行./mytest會報錯,錯誤代碼如下:
error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
因?yàn)橄到y(tǒng)找不到自定義的庫文件在那,可以有兩種方法解決這個問題。
方法一
庫文件、頭文件均在當(dāng)前目錄下,通過添加環(huán)境變量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
由于所有的庫文件都在當(dāng)前目錄下,所有將當(dāng)前路徑添加到環(huán)境變量中。然后在使用命令進(jìn)行編譯:
gcc mytest.c libmylib.so -o mytest
這時候程序可以正常運(yùn)行。
方法二
庫函數(shù)、頭文件假設(shè)均在/home文件夾下面,這個時候還需要添加環(huán)境變量
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
然后通過以下命令進(jìn)行編譯:
gcc mytest.c -o mytest -L/home -lmylib -I/home
然后執(zhí)行可以通過。
方法三
將指定庫函數(shù)和頭文件均在系統(tǒng)路徑下:
sudo cp libmylib.so /usr/lib
sudo cp mylib.h /usr/include
然后進(jìn)行編譯
gcc mytest.c -o mytest -lmylib
這個時候會顯示編譯通過,不需要添加環(huán)境變量。
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137395 -
靜態(tài)庫
+關(guān)注
關(guān)注
0文章
21瀏覽量
7471 -
編譯
+關(guān)注
關(guān)注
0文章
661瀏覽量
32963 -
動態(tài)庫
+關(guān)注
關(guān)注
0文章
17瀏覽量
6259
發(fā)布評論請先 登錄
相關(guān)推薦
評論