一、gcc編譯器
編譯器:把文件經過處理,生成對應的可執行文件。
//test.c文件:
X86平台上面:
gcc編譯器,可以在x86平台上面運行。
ARM平台上面的:
arm-linux-gcc
交叉編譯器:在一個平台編譯生成可執行文件,在另外一個平台運行可執行文件。
例如windows下面的keil就是一個交叉編譯器。
#include <stdio.h> void main(){ printf("hello world!\n"); }
gcc編譯
gcc main.c -o main
例子:
下面以一個很簡單的 main.c 來探討這個過程。
#include <stdio.h> #define NUM 3 int main(){ int t; #if 0 printf("hello world\n"); #endif t = NUM; printf("t=%d\n",t); return 0; }
(1) 預處理:gcc -E main.c -o main.i。
我們用cat查看main.i的內容如下:
(2) 編譯:gcc -S main.i -o main.s
(3) 匯編:as main.s -o main.o
nm main.o
(4) 鏈接:gcc -o main mian.o
二、多個文件的編譯
如果僅僅只有一個文件,直接:gcc main.c -o main.o
但是如果你的程序是使用模塊化編程的,又該怎么處理?
demo文件如下:
sequence.h
#ifndef _SEQUENCE_H_ #define _SEQUENCE_H_ void sequence(unsigned char*sp,unsigned char num); #endif
sequence.c
#include "sequence.h"void sequence(unsigned char *sp,unsigned char num) { unsigned char i,j; unsigned char a; for(j=0;j<num-1;i++) { for(i=j+1;i<num;i++) { if(sp[j]>sp[i]) { a=sp[i]; sp[i]=sp[j]; sp[j]=a; } } } }
main.c
#include <stdio.h> #include "sequence.h" unsigned char dis_num[8] = {10,9,17,92,2,8,35,12}; int main(void) { unsigned char i; sequence(dis_num,sizeof(dis_num)); for(i=0;i<8;i++)printf("%d ",dis_num[i]); printf("\r\n"); return 0; }
處理如下:
gcc -o sequence.o -c sequence.c gcc -o main.o -c main.c gcc -o main sequence.o main.o ./main
三、Linux的靜態庫和動態庫
上面2個文檔:sequence.c、sequence.h 可以做出庫的形式,讓其他的文件調用。
庫:可以分為靜態庫.a和動態庫.so;
靜態庫:會把庫相應的編譯到你的可執行文件里面;
動態庫:不會編譯到可執行文件里面,只有在執行時會調用庫的內容。
1、先制作靜態庫:
gcc -o sequence.o -c sequence.c ar crsv libsequence.a sequence.o gcc -o main main.c -L./ -lsequence -I./ ./main
2、制作動態庫:
gcc -fPIC -Wall -c sequence.c -o sequence.o gcc -shared -o libsequence.so sequence.o
gcc -o main main.c -L./ -lsequence sudo cp libsequence.so /lib #拷貝
或者
#gcc -o main main.c -L./ -Wl,-rpath,${PWD} -lsequence #指明路徑 ./main
后面 Makefile工程管理