1. 程式人生 > >LINUX下C語言編程調用其他函數、鏈接頭文件以及庫文件

LINUX下C語言編程調用其他函數、鏈接頭文件以及庫文件

blog head.s 鏈接 color pre () 如果 編譯 聲明

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語言編程調用其他函數、鏈接頭文件以及庫文件