gcc 的編輯方法

2021-04-12 22:29:29 字數 3400 閱讀 4043

[

編輯]交叉工具鏈名稱

i386

的工具名稱

歸屬作用

arm-linux-as

asbinutils

編譯arm

匯程式設計序

arm-linux-ar

arbinutils

把多個.o

合併乙個.o

或是靜態庫(.a)

arm-linux-ranlib

ranlib

binutils

為庫檔案建立索引,想當於*.as -s

arm-linux-ld

ldbinutils

聯接器(linker),

把多個.o

或是庫檔案鏈結乙個可以執行檔案

arm-linux-objdump

objdump

binutils

檢視目標檔案的(.o)

或是庫(.a

)的資訊

arm-linux-objcopy

objcopy

binutils

轉換成可以執行的elf

的檔案arm-linux-strip

strip

binutils

去掉elf

可以執行的資訊,是可以執行檔案變小

arm-linux-readelf

readelf

binutils

讀elf

的檔案頭

arm-linux-gcc

gccgcc

編譯.c

和.s的程式和彙編檔案

arm-linux-g++

g++gcc

編譯個g++程式[

編輯]

分別通過gcc和交叉編譯的工具進行編譯下面的例子,分別用靜態編譯、編譯成動態庫和反彙編的方法。

[

編輯]hello_first.c

程式原始碼:

#include

void hello_first(void)

[

編輯]hello_second.c

程式原始碼:

#include

void hello_second(void)

[

編輯]hello.c

程式原始碼:

#include

void hello_first(void);

void hello_second(void);

int main(int argc,char *argv)

[

編輯][ 編輯]

[ 編輯]

直接編譯

[ 編輯]

方法一

#gcc -c hello_first.c

#gcc -c hello_second.c

#gcc -o hello hello.c hello_first.o hello_second.o

[

編輯]方法二

#gcc -c hello_first.c hello_second.c

#gcc -o hello hello.c hello_first.o hello_second.o

[

編輯]方法三

#gcc -c -o first.o hello_first.c

#gcc -c -o second.o hello_second.c

#gcc -o hello hello.c first.o second.o

[

編輯]方法四

#gcc -o hello hello.c hello_first.c hello_second.c

[

編輯]編譯動態庫進行編譯

#gcc -c -fpic hello_first.c hello_second.c

#gcc -shared hello_first.o hello_second.o -o hello.so

#gcc -o hello hello.c hello.so

/*可以把編譯的hello.so拷貝到/lib下或是設定環境變數ld_library_path指向我們編譯的動態庫的

檔案位置,如,我們把hello.so拷貝到 /tmp下設定ld_library_path=/tmp,然後重新執行

#./hello*/

[

編輯]編譯成靜態庫進行編譯

#gcc -c hello_first.c hello_second.c

/*建立乙個靜態的鏈結庫*/

#ar -r libhello.a hello_first.o hello_second.o

/*為靜態鏈結庫建立索引*/

#ar -s libhello.a

#ranlib libhello.a

/*由靜態庫編譯成可以執行的檔案*/

#gcc -o hello hello.c -lhello -l./

或是#gcc -o hello hello.c libhello.a

/*編譯出來的hello可以脫離libhello.a執行*/

[

編輯]

#gcc -static -o hello hello.c hello_first.c hello_second.c

[

編輯]

編譯的大小比較

直接編譯

編譯成動態庫

編譯成靜態庫 

編譯成靜態檔案

[

編輯]

在對***,video,bmp的檔案進行讀取的時候,會對檔案的頭資訊或是具體的結構進行讀取,

是可以通過進行結構 體進行讀取資訊,但是在正常編譯的時候(gcc),會出現記憶體的漏洞,

因為在正常定義的時候,編譯器會根據具體的系統結構是按整位元組處理,這樣我們提出的數值

就會出現問題,可以這樣解決。

例子:

#include

int main(int argc,char **argv)

;printf("sizeof(struct test)=%d /n",sizeof(struct test));

}

輸出的結果並不是我們所需要的10byte,而是12byte,為什麼呢?因為在linux的

4個位元組對齊的。在第二個位元組裡面得就僅僅用了兩個位元組,可是在我們讀取的檔案信

息的時候就會出錯,可以這樣解決:

#include 

int main(int argc,char *argv)

__attribute__((packed));

printf("sizeof(struct test)=%d /n",sizeof(struct test))j;

}

gcc使用的方法

1。gcc包含的c c 編譯器 gcc,cc,c g gcc和cc是一樣的,c 和g 是一樣的,一般c程式就用gcc編譯,c 程式就用g 編譯 2。gcc的基本用法 gcc test.c這樣將編譯出乙個名為a.out的程式 gcc test.c o test這樣將編譯出乙個名為test的程式,o引數...

gcc常用的使用方法

自 linux公社 1。gcc包含的c c 編譯器 gcc,cc,c g gcc和cc是一樣的,c 和g 是一樣的,一般c程式就用gcc編譯,c 程式就用g 編譯 2。gcc的基本用法 gcc test.c這樣將編譯出乙個名為a.out的程式 gcc test.c o test這樣將編譯出乙個名為t...

gcc常用的使用方法

1 gcc包含的c c 編譯器 gcc,cc,c g gcc和cc是一樣的,c 和g 是一樣的,一般c程式就用gcc編譯,c 程式就用g 編譯 2 gcc的基本用法 gcc test.c這樣將編譯出乙個名為a.out的程式 gcc test.c o test這樣將編譯出乙個名為test的程式,o引數...