一、動(dòng)態(tài)編譯與靜態(tài)編譯
動(dòng)態(tài)編譯使用的是動(dòng)態(tài)庫文件進(jìn)行編譯,默認(rèn)使用的是動(dòng)態(tài)編譯方法。
gcc hello.c -o hello
靜態(tài)編譯使用的是靜態(tài)庫文件進(jìn)行的編譯
gcc -static hello.c -o hello
靜態(tài)編譯要把靜態(tài)庫文件打包編譯到可執(zhí)行程序中,動(dòng)態(tài)編譯不會(huì)把動(dòng)態(tài)庫文件打包編譯到可執(zhí)行程序中,它們只是編譯鏈接關(guān)系。
二、制作靜態(tài)庫
首先看一個(gè)例子,有一下三個(gè)c語言文件,mylib.c、mylib.h、mytest.c。mylib.h做函數(shù)的聲明,mylib.c做函數(shù)的定義,mytest.c做功能的測(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打包為一個(gè)庫文件。過程如下,首先我們讓想打包的文件生成.o文件
gcc -c mylib.c -o mylib.o
然后將這個(gè).o文件做成一個(gè)靜態(tài)庫,注意:靜態(tài)庫起名的時(shí)候必須以lib開頭以.a結(jié)尾。
ar rc libmylib.a mylib.o
制作好靜態(tài)庫之后,我們可以編譯程序了,這時(shí)候就可以不使用mylib.c文件了。編譯程序有三種方法如下:
方法一
這幾個(gè)文件都在同一個(gè)目錄下面,就可以不用這么麻煩,直接使用下面的命令就可以完成編譯。
gcc -static mytest.c libmylib.a -o mytest
方法二
可以指定頭文件及庫文件路徑,比如我們可以將libmylib.a和mylib.h移動(dòng)到/home/test文件夾下,那么可以使用的命令如下:
gcc -static mytest.c -o mytest -L/home/test -lmylib -I/home/test
下面對(duì)其中的參數(shù)做一些解釋:
- -L是指定庫文件的路徑
- -l是指定找哪個(gè)庫,指定的只要庫文件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是指定的要找哪個(gè)庫。
三、制作動(dòng)態(tài)庫
還是上面代碼的例子,生成一個(gè)mylib.c的動(dòng)態(tài)庫文件。
1、首先是將要加入動(dòng)態(tài)庫的源文件編譯為與位置無關(guān)的目標(biāo)文件。
gcc -fPIC -c mylib.c
這時(shí)候就會(huì)生成一個(gè)與位置無關(guān)的目標(biāo)文件,關(guān)于為什么會(huì)加上-fPIC的選項(xiàng),可以參考這個(gè)博客。
2、然后第二步是將第一步生成的目標(biāo)文件打包到動(dòng)態(tài)庫文件 。
gcc -shared -o libmylib.so mylib.o
3、然后是動(dòng)態(tài)庫鏈接生成可執(zhí)行文件
gcc mytest.c libmylib.so -o mytest
但是這時(shí)候執(zhí)行./mytest會(huì)報(bào)錯(cuò),錯(cuò)誤代碼如下:
error while loading shared libraries: libmylib.so: cannot open shared object file: No such file or directory
因?yàn)橄到y(tǒng)找不到自定義的庫文件在那,可以有兩種方法解決這個(gè)問題。
方法一
庫文件、頭文件均在當(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
這時(shí)候程序可以正常運(yùn)行。
方法二
庫函數(shù)、頭文件假設(shè)均在/home文件夾下面,這個(gè)時(shí)候還需要添加環(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
這個(gè)時(shí)候會(huì)顯示編譯通過,不需要添加環(huán)境變量。
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136683 -
靜態(tài)庫
+關(guān)注
關(guān)注
0文章
21瀏覽量
7426 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32852 -
動(dòng)態(tài)庫
+關(guān)注
關(guān)注
0文章
17瀏覽量
6222
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論