GNU 編譯工具 —— gccc++
gcc [選項參數] c文件函數
-o 指定輸出文件 工具
gcc -o main ch01.c
二、警告與提示
優化
-pedantic 檢測不符合ANSI/ISO C語言標準的源代碼,使用擴展語法的地方將產生警告信息。spa
-Wall 生成儘量多的警告信息。調試
-Werror 要求編譯器將警告當作錯誤進行處理。code
-x 指定編譯代碼類型,c、c++、assembler,none。None根據擴展名自動確認。 對象
gcc –x c -Wall –o main ch01.c
-g 生成調試信息字符串
-O 優化編譯器
.a 靜態對象庫
.c 須要預處理的C語言源代碼
.h C語言源代碼頭文件
.i 不須要預處理的C語言源代碼
.o 目標文件
.s 彙編語言代碼
.so 共享對象庫
一、語法:gcc -E C源代碼文件
二、注意:
預處理每次只能處理一個文件。不能處理多個文件,就是每一個.c文件對應一個.i文件。
不指定 –o 選項,預處理的結果輸出到標準輸出設備。
三、預編譯指令
#define 定義宏
#elif else if 多選分支
#else 與#if、#ifndef、#ifdef結合使用
#error 產生錯誤、掛起與處理程序
#if 斷定
#endif 結束斷定
#ifdef 斷定宏是否認義
#ifndef 斷定宏是否認義
#include 將指定的文件插入#include的位置
#include_next 與#include同樣,但從當前目錄以後的目錄查找
#line 指定行號
#pragma 提供額外信息的標準方法,可用來指定平臺
#undef 刪除宏
#warning 建立一個警告
## 鏈接操做符號,用於宏內鏈接兩個字符串
編譯環境變量:
C_INCLUDE_PATH: 查找頭文件的目錄——C。
CPATH: 查找頭文件,至關於-l選項。
CPLUS_INCLUDE_PATH: 查找頭文件的目錄——C++。
LD_LIBRARY_PATH: 編譯沒有影響,主要影響運行。指定目錄便於定位共享庫。
LIBRARY_PATH: 查找鏈接文件,至關於-l選項
一、編譯成彙編
gcc -S ch01.c ch01_1.c
二、編譯彙編
gcc ch01.s ch01_1.s -o main
d.連接
gcc -c -static ch01_1.c
說明:
其中-static可選,可阻止gcc使用共享庫,不使用共享庫會使可執行文件變大,但會減小運行時間開銷
ar -r libmy.a ch01_1.o
gcc -o main ch01.c libmy.a
若是libmy.a在LIBRARY_PATH的指定目錄中,還能夠採用以下方式編譯。
gcc ch01.c -o main –lmy
一、編譯成位置獨立代碼的目標文件,選項-fpic
gcc -c -fpic ch01_1.c
二、編譯成共享庫,選項-shared
gcc -shared ch01_1.o -o libmy.so
三、使用一條指令
gcc -fpic -shared ch01_1.c -o libmy.so
一、共享庫編譯的時候與靜態庫同樣依賴LIBRARAY_PATH,運行的時候依賴LD_LIBRARY_PATH。
二、規則:
查找LD_LIBRARY_PATH,目錄使用冒號分隔。
/ect/ld.so.cache中找到的列表。工具ldconfig維護。
目錄/lib
目錄/usr/lib
gcc ch01.c libmy.so -o main
頭文件:#include <dlfcn.h>
void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle);
其中dlopen的參數flag的含義以下:
RTLD_LAZY:符號查找時候才加載。
RTLD_NOW:立刻加載。