第一節 linux c編譯

2021-06-01 18:41:10 字數 2875 閱讀 6823

在linux中開發c或c++程式的步驟:

先用vim編輯c或c++程式  c儲存為.c c++儲存為.cc 或.cpp檔案

對於.c格式的c檔案,可以採用gcc或g++編譯

對於 .cc、.cpp格式的c++檔案,應該採用g++進行編譯

gcc編譯過程

gcc所支援字尾名

預處理階段:對包含的標頭檔案(#include)和巨集定義(#define、#ifdef等)進行處理

gcc –e hello.c –o hello.i

編譯階段:檢查**規範性、語法錯誤等,在檢查無誤後把**翻譯成組合語言

gcc –s hello.i –ohello.s

gcc常用選項

gcc庫選項

函式庫分為靜態庫和動態庫,靜態庫是目標檔案.o的歸檔檔案(格式為libname.a)。如果在編譯某個程式時鏈結靜態庫,則鏈結器將會搜尋靜態庫並直接拷貝到該程式的可執行二進位制檔案到當前檔案中;動態庫(格式為libname.so[.主版本號.次版本號.發行號])在程式編譯時並不會被鏈結到目標**中,而是在程式執行時才被載入。

建立靜態庫

$ gcc -c  add.c

$ ar  rcsv libadd.a  add.o

$ gcc  -o  mian  main.c  -l.  –ladd

$./main

建立動態庫

$ gcc -fpic  -wall -c  add.c

$ gcc -shared-o  libadd.so add.o

$ gcc -o mainmain.c -l.  –lpow

在執行main前,需要註冊動態庫的路徑。方法有3種:修改/etc/ld.so.conf或修改ld_library_path環境變數或將庫檔案拷貝到/lib或者/usr/lib下(系統預設搜尋庫路徑)。

$ cp add.so /lib

$ ./main

靜態庫與動態庫的比較

動態庫只在執行時才被鏈結使用,不是直接編譯入可執行檔案,並且乙個動態庫可以被多個程式使用故可稱為共享庫,而靜態庫將會整合到程式中,因此在程式執行時不用載入靜態庫。因此,靜態庫會使你的程式臃腫並且難以公升級,但比較容易部署。而動態庫會使你的程式輕便易於公升級但難以部署。

gcc--- 警告選項

$ gcc –ansiwarning.c –o warning

warning.c: 在函式「main」中:

warning.c:7 警告:在無返回值的函式中,「return」帶返回值

warning.c:4 警告:「main」的返回型別不是「int」

$ gcc –pedanticwarning.c –o warning

warning.c: 在函式「main」中:

warning.c:5 警告:iso c90不支援「long long」

warning.c:7 警告:在無返回值的函式中,「return」帶返回值

warning.c:4 警告:「main」的返回型別不是「int」

$ gcc –wallwarning.c –o warning

warning.c:4 警告:「main」的返回型別不是「int」

warning.c: 在函式「main」中:

warning.c:7 警告:在無返回值的函式中,「return」帶返回值

warning.c:5 警告:未使用的變數「tmp」

gcc--- 優化選項

gcc對**進行優化通過選項「-on」來控制優化級別(n是整數)。

-d 《巨集定義》 編譯時將巨集定義傳入進去

例:有兩個檔案main.cpp,func.cpp

其中main.cpp內容為:

#include

int myfunc();

int main()

#ifdef _debug

printf("debug myfuncis:%d\n",myfunc());

#else

printf("ndebug myfuncis:%d\n",myfunc());

#endif

func.cpp內容為:

int myfunc()

return 123;

編譯和連線:

1、 g++ -c func.cpp

將編譯func.cpp,並且生成同名的但擴充套件名為.o的二進位制目標檔案 func.o

g++ -c main.cpp

將編譯main.cpp,並且生成同名的但擴充套件名為.o的二進位制目標檔案main.o

2、g++ -c func.cpp -o func.o

g++ -c main.cpp –o main.o

編譯main.cpp,並輸出目標檔案main.o

3、 鏈結

g++ main.o func.o

g++ -o a.out main.o func.o

g++ -o a.out *.o

都將連線目標檔案main.o和func.o最後形成可執行檔案a.out

對於第一種,如果沒有顯式指定可執行檔名,g++預設為a.out

g++ *.cpp

g++ func.cppmain.cpp

g++ -o a.outfunc.cpp main.cpp

都將先編譯指定的原始檔,如果成功的話,再鏈結成可執行檔案a.out

採用第4種方式,在其中第某個原始檔中必須有main函式,否則鏈結通不過。

5、 如果希望在編譯時傳入巨集定義,可使用-d引數,例如

g++ -d _debug*.cpp

編譯原理 第一節

把用某一種程式語言寫的源程式翻譯成等價的另一種語言程式 目標程式 的程式,稱之為編譯程式或翻譯程式 乙個源程式編寫後要投入執行,需要編譯程式支援的執行過程分為兩個階段 編譯階段和執行階段 整個結構可以分為前端 front end 和 後端 back end 亦即分析階段和綜合階段 為什麼要分為前端和...

第一節綜述

shader是什麼?shader是著色器。渲染流水線的概念?渲染流水線的工作任務在於由乙個三維場景出發,生成一張二維影象。渲染流程分為3個階段 應用階段 幾何階段 光柵化階段。1 應用階段 由cpu負責實現,由開發者主導。最重要的輸出是渲染所需的幾何資訊,即渲染圖元。這些渲染圖元傳遞給幾何階段。2 ...

第一節 熱機

一.熱機 內燃機是熱機的一種,以汽油或柴油為燃料 二.汽油機 練1.三.柴油機 練2.從能量轉化的角度看,一台四衝程內燃機在乙個迴圈中 1 哪個衝程存在著化學能轉化為內能的過程?2 哪個衝程存在著內能轉化為機械能的過程?3 哪個衝程具有很明顯的機械能轉化為內能的過程?練3.關於單缸四衝程內燃機,下列...