gcc編譯器用法

一個用c語言寫的程序把他編譯成計算機可執行的文件,通常有4個步驟函數

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名稱:helloworld.c
*   創 建 者:ghostwu(吳華)
*   描    述:gcc編譯器用法演示
*
================================================================*/

#include <stdio.h>
#define HELLO "hello world!\n"

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

1,預處理:這個步驟,主要是包含頭文件,展開宏定義工具

gcc -E helloworld.c -o helloworld.ispa

2,生成彙編代碼調試

gcc -S helloworld.i -o helloworld.scode

3,編譯彙編blog

gcc -c helloworld.s -o helloworld.o編譯器

4,連接io

gcc helloworld.o -o helloworld編譯

一般寫完程序,咱們用 gcc helloworld.c -o helloworld 直接完成以上四個步驟class

 

gcc經常使用選項含義:

1. -o output_filename
肯定可執行文件的名稱爲output_filename。若是不給出這個選項,gcc就給出預設的可執行文件名a.out。

2. -c
只編譯,不連接成爲可執行文件,編譯器只是由輸入的.c等源文件生成.o爲後綴的目標文件。

3. -g
產生調試工具(gdb)所必要的符號信息,要想對編譯出的程序進行調試,就必須加入這個選項。

4. -ldirname
將dirname所指出的目錄加入到程序頭文件目錄列表中。

5. -Ldirname
將dirname所指出的目錄加入到庫文件的目錄列表中。

6. -Wall
生成全部警告信息。

 

gcc編譯多個模塊

helloworld.h

 1 ==============================================================
 2 *   Copyright (C) 2018 . All rights reserved.
 3 *   
 4 *   文件名稱:helloworld.h
 5 *   創 建 者:ghostwu(吳華)
 6 *   描    述:
 7 *
 8 ================================================================*/
 9 
10 #ifndef _HELLO_H_
11 #define _HELLO_H_
12 void say_hello( const char* name );
13 #endif

helloworld.c

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名稱:helloworld.c
*   創 建 者:ghostwu(吳華)
*
================================================================*/

#include <stdio.h>
#include "helloworld.h"

void say_hello( const char* name ) {
    printf( "%s\n", name );
}

main.c

/*================================================================
*   Copyright (C) 2018 . All rights reserved.
*   
*   文件名稱:main.c
*   創 建 者:ghostwu(吳華)
*   描    述:
*
================================================================*/


#include "helloworld.h"

int main(int argc, char *argv[])
{
    say_hello( "hello ghostwu" );
    return 0;
}

編譯命令:

gcc helloworld.c main.c -o hello

 

打包靜態庫(就是一堆通用函數的集合,用.o文件打包):

1,首先生成.o文件

gcc -c helloworld.c -o helloworld.o

2,ar rcs libhello.a helloworld.o

r:替換  c:建立 s:保存

把helloworld打包成 libhello.a靜態庫

3,用靜態庫編譯 生成 可執行文件

gcc -Wall main.c libhello.a -o main

也能夠使用l和L 選項

小寫的l: 指定庫文件名

大寫的L: 指定庫所在的路徑

gcc -Wall main.c -o main2 -lhello( 這種方式會報錯,在連接庫的時候,沒有用L指定路徑,默認狀況下 不會在當前目錄查找靜態庫 )

gcc -Wall -L. main.c -o main2 -lhello( L後面跟個. 表明當前目錄下查找所連接的庫(libhello.so) ), -lhello: 省略lib和後綴(.so)

這個時候刪除靜態庫libhello.so,生成的main和main2文件,依然能執行,由於靜態庫已經被包含在可執行文件中

相關文章
相關標籤/搜索