本節主要講 gcc
gcc(gnu compiler collection)是由gnu開發的程式語言譯器
gcc 一般對 c,g++ 對 c++,主要就是庫不同
gcc 在乎檔案字尾( gcc 不是 linux 的 shell ,shell 不在乎字尾名)
目錄
動態庫與靜態庫
編譯與鏈結
優化打包
如何做靜態庫
gcc 工程示例
gcc 預設連線動態庫
靜態庫:(static,.a 檔案)函式已經存在在可執行程式中,相容性好,但不利於程式的公升級,要公升級還要去程式裡找公升級了哪些庫函式
動態庫:(shared,.s 檔案)函式不在可執行程式中,要用到這個函式的時候還要跳轉到庫,相容性不好
鏈結靜態庫,可執行程式可以在沒有 gcc 的機器上執行,如果你這個程式以後都不動了(比如一些簡單的嵌入式)可以考慮;
鏈結動態庫,可執行程式只能在有 gcc 的機器上執行,但是便於公升級,對於沒裝 gcc 的普通使用者來說,只要把最新的 gcc 公升級(覆蓋舊的 gcc ),軟體就公升級了,通常都用動態庫
一般的乙個 gcc 工程的檔案目錄如下
project/src/*.c makefile focus
/include/*.h
/lib/*.a *.so libstuff.a lisstuff.so
/bin/ *
/tools/*.sh *.py
看乙個最簡單的 gcc 程式
gcc 一行命令完成編譯和鏈結
編譯:把程式**(.c檔案)變成機器碼(.o 檔案);標頭檔案(.**件)和 .c 檔案放在同一目錄下,命令列編譯時候 shell 會自己找
先 -c 再 -o
-o 的時候要注意順序,把最底層的庫寫在最右邊,也就是左邊的庫會依賴右邊的庫
有六個優化級別
在除錯階段不要優化,除錯完了再優化(也就是說用完 -g 再用 -o),同時用 -g 和 -o 可能會出現奇怪的錯誤
因為優化加快了程式速度,但相容性會變差,一般就用 o2 別太高
除錯 -g 後是可以看到源**的,優化後 -o 就看不到源**了
庫檔案必須 lib 打頭
現在有乙個檔案1.txt ,內容如下:
$ vi 1.txt
0.3 5
5.77
5.3 55
667 55
33255.6
77.8
343.01
788設計乙個含 makefile 檔案的工程, 實現求最大數(檔案max.c),最小數(檔案min.c),算術平均數(檔案m-mean.c),幾何平均數(檔案g-mean.c),方差(檔案var.c), 寫出:
寫出main.c 和各個子函式(主要是呼叫個子檔案中的函式的流程)
寫出makefile
編譯後,執行,貼出拷屏的結果。
注:以下所有檔案均在同乙個目錄下,標頭檔案就按 .c 檔案中的去宣告就ok
makefile
cc = gcc
cflags = -wall
main:main.o var.o m_mean.o g_mean.o min.o max.o
$(cc) -o main $^ -lm
%.o:%.c
$(cc) $(cflags) -c $^
clean:
rm -rf main.o max.o min.o m_mean.o g_mean.o var.o
main.c
#include #include #include #include "max.h"
#include "min.h"
#include "m_mean.h"
#include "g_mean.h"
#include "var.h"
int main()
fclose(fp); //remenber to close
int size=j-1;
printf("read %d numbers in 1.txt\n",size);
printf("they are:\n");
for(int i=0;imax.c
#include float max(float arr, int size)
min.c
#include float min(float arr, int size)
{ float result=arr[0];
for(int i=0;ig_mean.c
#include #include float g_mean(float arr,int size)
{ float mul=0;
for(int i=0;im_mean.c
#include float m_mean(float arr, int size)
{ float sum=0;
for(int i=0;ivar.c
#include #include "m_mean.h"
float var(float arr,int size)
{ float og_m = m_mean(arr,size); //m-mean of the original arr
float new_arr[size];
for(int i=0;i如何執行:
Linux學習筆記06之DNS
一 dns概念 domain name system 網域名稱系統 是網際網路上作為網域名稱和ip位址相互對映的乙個分布式資料庫 二 dns功能 完成ip位址和網域名稱之間的乙個對映 三 dns分類 1 靜態對映 每台裝置上都配置主機到ip位址的對映,各裝置獨立維護自己的對映表,而且只供本裝置使用 ...
學習筆記06
do while 水仙花 從100到999 各個位數的立方和相加等於這個數本身就是乙個水仙花數 include intmain void i while i 999 return0 pow 用來計算以x為底的y次方值 include 上述式子可改為 if pow a,3 pow b,3 pow c,...
Android入門筆記 06 布局
android的五大布局分別是linearlayout 線性布局 framelayout 單幀布局 relativelayout 相對布局 absolutelayout 絕對布局 和tablelayout 布局 1 linearlayout 分為水平和垂直.通過 android orientatio...