LINUX下C語言編程調用其他函數、鏈接頭文件以及庫文件
LINUX下C語言編程經常需要鏈接其他函數,而其他函數一般都放在另外.c文件中,或者打包放在一個庫文件裏面,我需要在main函數中調用這些函數,主要有如下幾種方法:
1.當需要調用函數的個數比較少時,可以直接在main函數中包含該文件,比如一個文件夾下包含add.c和main.c文件:
方法一:
文件add.c定義兩個整數相加的函數,code如下:
#include <stdio.h> #include <math.h> int add(int a,int b) { int z; z=a+b; return z; }
主函數main.c的code如下:
#include <stdio.h> #include <math.h> #include"add.c" int main() { int i, j, k; i=1; j=2; k=add(i,j); printf("i add j=%d\n", k); }
編譯生成可執行文件:gcc -o main main.c
執行: ./main
方法二:
可以通過寫個頭文件聲明下函數add,然後在main函數中包含該文件,再寫個makefile文件,將其鏈接好即可,實現如下:
新建fun.h, code如下:
#ifndef _FUN_H_#define _FUN_H_ #endif #include<stdio.h> #include<math.h> int add(int a,int b);
此時main函數應當包含這個頭文件,main函數改為如下:
#include <stdio.h> #include <math.h> #include"fun.h" int main() { int i, j, k; i=1; j=2; k=add(i,j); printf("i add j=%d\n", k); }
寫個簡單的makefile,編譯
main:main.o add.o gcc main.o add.o -o main main.o:main.c fun.h add.c gcc -c main.c -o main.o add.o:add.c fun.h gcc -c add.c -o add.o
make ,即可得到可執行文件main
./main ,就得到結果。
2.當定義的函數比較多時,這時可以將其打包放在一個庫文件裏面,然後在編譯main函數時鏈接該庫文件即可,庫文件分為動態庫和靜態庫,其鏈接方法如下:
比如:
目錄1:/home/文檔/libraries_test/head //裏面有 add.c multi.c (multi.c定義為兩個整數相乘,這裏沒有列出)
目錄2:/home/文檔/libraries_test/test_head //裏面有函數,需要包含目錄一裏的頭文件 main.c
靜態庫鏈接:
cd 目錄1
寫個makefile文件,生成靜態庫。makefile內容如下:
add.o:add.c gcc -c add.c -o add.o multi.o:multi.c gcc -c multi.c -o multi.o libhead.a:add.o multi.o ar crv libhead.a add.o multi.o
然後:make
生成了libhead.a文件
cd 目錄2
寫個makefile文件,生成可執行文件
main:main.c
gcc main.c -I${目錄1}$ -o main -L${目錄1}$ -lhead
註意:-I..這個路徑指的是頭文件的路徑(由於這裏沒有頭文件,可以去掉-I{目錄1})
-L...這個指的是庫的路徑,-l..這裏指的是庫名,如果需要引用-L..下的兩個庫(如libblas.a libcblas.a)
這個時候就這樣寫: -L... -lcblas -lblas (註意:雖然用的是libcblas.a和libblas.a 但是在寫路徑時,只需寫cblas和blas,即省略lib .a)
註意啦!!!!如將該.a文件放在/usr/lib或者/usr/local/lib下(gcc默認的庫搜索路徑下,由於/usr/lib下庫文件比較多,我一般把常用的庫放在/usr/local/lib下),此時就不需要指定路徑了,這個時候編譯:
gcc test1.c -o test -lcblas -lblas (註意編譯的時候一定要用 -l.. 指定是哪個庫)
動態庫鏈接:
cd 目錄1
寫個makefile文件,生成動態庫。makefile內容如下:
add.o:add.c head.h
gcc -c add.c -o add.o
multi.o:multi.c head.c gcc -c multi.c -o multi.o
libhead.so:add.o multi.o gcc -o libhead.so -fPIC add.o multi.o
然後:make
生成了libhead.so文件
cd 目錄2
寫個makefile文件,生成可執行文件
makefile文件生成如下:
main:main.c
gcc main.c -I${目錄1}$ -o main -Wl,-rpath,${目錄1}$ -lhead
make即可生成可執行文件main,然後執行即可。
LINUX下C語言編程調用其他函數、鏈接頭文件以及庫文件