gcc學習(一)[第二版]

gcc簡單介紹

一、 gcc是GNU Compiler Collection的縮寫。前端

最初是做爲C語言的編譯器(GNU C  Compiler),做者爲Richard Stallman。是GNU項目的奠定者;現在已經支持多種語言。如C、C++、Java、Pascal、Ada、COBOL語言等 。架構

 

二、主要特徵:模塊化

gcc是一個可移植的編譯器,支持多種硬件平臺,甚至對Don Knuth 設計的 MMIX 這類不常見的計算機都提供了無缺的支持 優化

gcc不不過個本地編譯器,它還能跨平臺交叉編譯(在本地編譯的程序。可以運行在其它平臺之上)。spa

gcc有多種語言前端。用於解析不一樣的語言。設計

gcc是按模塊化設計的,可以增長新語言和新CPU架構的支持調試

gcc是自由軟件code

 

gcc編譯程序的過程

 

1)預處理(Pre-Processing) [-E] #頭文件展開ci

2)編譯(Compiling) [-S]編譯器

3)彙編(Assembling) [-c] 

4)連接(Linking) [不加不論什麼選項]

 

 

常常使用選項

選項

做用

-E

預處理,生成.i文件

-S

編譯,生成.s彙編文件

-c

彙編,編譯源代碼生成.o目標文件

Null

連接,並不需要不論什麼選項

-o

生成目標文件。如.i,.o,.s,可運行文件,默以爲a.out文件等

-Wall

使gcc對源代碼有問題的地方發出警告

-I[dir]

將dir增長頭文件的搜索路徑

-L[dir]

將dir增長庫文件的搜索路徑

-l[lib]

連接lib

-g

在目標文件裏嵌入調試信息,以便gdb調試程序調試

-O

優化編譯後的代碼

-w

關閉全部警告信息[不推薦]

 

 

演示樣例

//測試程序
#include <stdio.h>

#define HELLO "Hello World!!!\n"

int main(int argc,char *argv[])
{
    printf(HELLO);

    return 0;
}

 

操做:

gcc -E hello.c -o hello.i(預處理)

 

 

gcc -S hello.i -o hello.s(編譯,生成彙編代碼)

 

 

gcc -c hello.s -o hello.o(彙編,生成二進制代碼)

 

 

gcc hello.o -o hello(連接:不需要額外選項,生成可運行文件)

 

 


gcc hello.c -o hello(直接編譯連接成可運行目標文件)

gcc -c hello.c或gcc -c hello.c -o hello.o(編譯生成可重定位目標文件)

 

-Wall的使用

建議初學都加上-Wall選項。有些程序不加-Wall選項,編譯器不報不論什麼錯誤,但是獲得的結果卻不是預期的。例如如下:

//bad.c
#include <stdio.h>

int main(int argc,char *argv[])
{
    printf("2 + 2 = %f\n",4);

    return 0;
}



gcc編譯多個文件

一次性編譯

gcc [-Wall] hello_fn.c main.c –o newhello

 

獨立編譯

gcc -Wall -c main.c -o main.o

gcc -Wall -c hello_fn.c -o hello_fn.o

gcc -Wall main.o hello_fn.o -o newhello #連接生成可運行文件

長處:假設不過修改了一個模塊,則不用再次編譯全部模塊。以節省編譯時間[推薦]

 

附-測試程序

//hello_fu.h
#ifndef _HELLO_FUN_H
#define _HELLO_FUN_H

void hello(const char *str);

#endif

//hello_fu.c
#include <stdio.h>
#include "hello_func.h"

void hello(const char *str)
{
    printf("Hello %s\n",str);
    printf("Compiled: "__DATE__" at "__TIME__"\n");
    printf("This is line %d of file %s\n",__LINE__,__FILE__);

    return;
}

//main.c
#include "hello_func.h"

int main()
{
    hello("world");

    return 0;
}

附-Makefile

CC = gcc 

CFLAGS = -Wall -g

 

BIN = main

SOURCES = $(wildcard *.c)

OBJECTS = $(SOURCES:.c=.o)

 

.PHONY: all clean

 

all: $(BIN)

$(BIN): $(OBJECTS)

$(CC) $(CFLAGS) -o $@ $^

 

%.o: %.c 

$(CC) $(CFLAGS) -c $< -o $@

 

clean:

-rm -rf $(BIN) $(OBJECTS)


gcc需要識別文件擴展名

 

擴展名

含義

.c

C源文件

.cpp/cc

C++源文件

.o

目標文件

.s

彙編語言源文件

.a/.so

編譯後的庫文件

 

 

 

用gcc發現出錯之處

 

發現是在連接階段出了錯!

 

 

C/C++編譯完畢以後的代碼是不一樣的

相關文章
相關標籤/搜索