linux入門學習筆記 06

2021-10-06 15:11:00 字數 2836 閱讀 9258

本節主要講 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...