gcc編譯器


一、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工程管理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM