標籤:目錄 執行檔案 其他 連結 blog clu 相加 makefile str
LINUX下C語言編程經常需要連結其他函數,而其他函數一般都放在另外.c檔案中,或者打包放在一個庫檔案裡面,我需要在main函數中調用這些函數,主要有如下幾種方法:
1.當需要調用函數的個數比較少時,可以直接在main函數中包含該檔案,比如一個檔案夾下包含add.c和main.c檔案:
方法一:
檔案add.c定義兩個整數相加的函數,code如下:
#include <stdio.h>#include <math.h>intadd(int a,int b){ int z; z=a+b; return z;}
主函數main.c的code如下:
#include <stdio.h>#include <math.h>#include"add.c"intmain(){ 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"intmain(){ 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 mainmain.o:main.c fun.h add.c gcc -c main.c -o main.oadd.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語言編程調用其他函數、連結標頭檔以及庫檔案