GCC常用選項使用詳解

通常所說的GCC是GUN Compiler Collection的簡稱,除了編譯程序之外,它還含其他相關工具,所以它能把易于人類使用的高級語言編寫的源代碼構建成計算機能夠直接執行的二進制代碼。GCC是Linux平臺下最常用的編譯程序,它是Linux平臺編譯器的事實標準。同時,在Linux平臺下的嵌入式開發領域,GCC也是用得最普遍的一種編譯器。GCC之所以被廣泛采用,是因為它能支持各種不同的目標體系結構。例如,它既支持基于宿主的開發(簡單講就是要為某平臺編譯程序,就在該平臺上編譯),也支持交叉編譯(即在A平臺上編譯的程序是供平臺B使用的)。目前,GCC支持的體系結構有四十余種,常見的有X86系列、Arm、 PowerPC等。同時,GCC還能運行在不同的操作系統上,如Linux、Solaris、Windows等。

除了上面講的之外,GCC除了支持C語言外,還支持多種其他語言,例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。

本系列文章中,我們不僅介紹GCC的基本功能,還涉及到一些諸如優化之類的高級功能。另外,我們還考察GCC的一些映像操作工具,如size和objcopy等,這將在后續的文章中加以介紹。

二、程序的編譯過程

對于GUN編譯器來說,程序的編譯要經歷預處理、編譯、匯編、連接四個階段,如下圖所示:

?????

從功能上分,預處理、編譯、匯編是三個不同的階段,但GCC的實際操作上,它可以把這三個步驟合并為一個步驟來執行。下面我們以C語言為例來談一下不同階段的輸入和輸出情況。

在預處理階段,輸入的是C語言的源文件,通常為*.c。它們通常帶有.h之類頭文件的包含文件。這個階段主要處理源文件中的#ifdef、 #i nclude和#define命令。該階段會生成一個中間文件*.i,但實際工作中通常不用專門生成這種文件,因為基本上用不到;若非要生成這種文件不可,可以利用下面的示例命令:

gcc -E??? test.c -o test.i

在編譯階段,輸入的是中間文件*.i,編譯后生成匯編語言文件*.s 。這個階段對應的GCC命令如下所示:

GCC -S test.i -o test.s

在匯編階段,將輸入的匯編文件*.s轉換成機器語言*.o。這個階段對應的GCC命令如下所示:

GCC -c test.s -o test.o

最后,在連接階段將輸入的機器代碼文件*.s(與其它的機器代碼文件和庫文件)匯集成一個可執行的二進制代碼文件。這一步驟,可以利用下面的示例命令完成:

GCC test.o -o test

上面介紹了GCC編譯過程的四個階段以及相應的命令。下面我們進一步介紹常用的GCC的模式。

三、GCC常用模式

這里介紹GCC追常用的兩種模式:編譯模式和編譯連接模式。下面以一個例子來說明各種模式的使用方法。為簡單起見,假設我們全部的源代碼都在一個文件test.c中,要想把這個源文件直接編譯成可執行程序,可以使用以下命令:

$ GCC -o test

這里test.c是源文件,生成的可執行代碼存放在一個名為test 的文件中(該文件是機器代碼并且可執行)。-o 是生成可執行文件的輸出選項。如果我們只想讓源文件生成目標文件(給文件雖然也是機器代碼但不可執行),可以使用標記-c ,詳細命令如下所示:

$ GCC -c test.c

默認情況下,生成的目標文件被命名為test.o,但我們也可以為輸出文件指定名稱,如下所示:

$ GCC -c test.c -o

上面這條命令將編譯后的目標文件命名為mytest.o,而不是默認的test.o。

迄今為止,我們談論的程序僅涉及到一個源文件;現實中,一個程序的源代碼通常包含在多個源文件之中,這該怎么辦?沒關系,即使這樣,用GCC處理起來也并不復雜,見下例:

$ GCC -o test??? first.c second.c third.c

需要注意的是,要生成可執行程序時,一個程序無論有有一個源文件還是多個源文件,所有被編譯和連接的源文件中必須有且僅有一個mai n函數,因為main 函數是該程序的入口點(換句話說,當系統調用該程序時,首先將控制權授予程序的main函數)。但如果僅僅是把源文件編譯成目標文件的時候,因為不會進行連接,所以main函數不是必需的。

四、常用選項

許多情況下,頭文件和源文件會單獨存放在不同的目錄中。例如,假設存放源文件的子目錄名為./src,而包含文件則放在層次的其他目錄下,如./inc。當我們在./src 目錄下進行編譯工作時,如何告訴GCC到哪里找頭文件呢?方法如下所示:

$ gcc test.c –I../inc -o test

上面的命令告訴GCC包含文件存放在./inc 目錄下,在當前目錄的上一級。如果在編譯時需要的包含文件存放在多個目錄下,可以使用多個-I 來指定各個目錄:

$ gcc test.c –I../inc –I../../inc2 -o test

這里指出了另一個包含子目錄inc2,較之前目錄它還要在再上兩級才能找到。

另外,我們還可以在編譯命令行中定義符號常量。為此,我們可以簡單的在命令行中使用-D選項即可,如下例所示:

$ gcc -DTEST_CONFIGURATION test.c -o test

上面的命令與在源文件中加入下列命令是等效的:

#define TEST_CONFIGURATION

在編譯命令行中定義符號常量的好處是,不必修改源文件就能改變由符號常量控制的行為。

五、警告功能

當GCC 在編譯過程中檢查出錯誤的話,它就會中止編譯;但檢測到警告時卻能繼續編譯生成可執行程序,因為警告只是針對程序結構的診斷信息,它不能說明程序一定有錯誤,而是存在風險,或者可能存在錯誤。雖然GCC提供了非常豐富的警告,但前提是你已經啟用了它們,否則它不會報告這些檢測到的警告

在眾多的警告選項之中,最常用的就是-Wall選項。該選項能發現程序中一系列的常見錯誤警告,該選項用法舉例如下:

$ gcc -Wall test.c -o test

該選項相當于同時使用了下列所有的選項:

◆unused-function:遇到僅聲明過但尚未定義的靜態函數時發出警告。

◆unused-label:遇到聲明過但不使用的標號的警告。

◆unused-parameter:從未用過的函數參數的警告。

◆unused-variable:在本地聲明但從未用過的變量的警告。

◆unused-value:僅計算但從未用過的值得警告。

◆Format:檢查對printf和scanf等函數的調用,確認各個參數類型和格式串中的一致。

◆implicit-int:警告沒有規定類型的聲明。

◆implicit-function-:在函數在未經聲明就使用時給予警告。

◆char-subscripts:警告把char類型作為數組下標。這是常見錯誤,程序員經常忘記在某些機器上char有符號。

◆missing-braces:聚合初始化兩邊缺少大括號。

◆Parentheses:在某些情況下如果忽略了括號,編譯器就發出警告。

◆return-type:如果函數定義了返回類型,而默認類型是int型,編譯器就發出警告。同時警告那些不帶返回值的 return語句,如果他們所屬的函數并非void類型。

◆sequence-point:出現可疑的代碼元素時,發出報警。

◆Switch:如果某條switch語句的參數屬于枚舉類型,但是沒有對應的case語句使用枚舉元素,編譯器就發出警告(在switch語句中使用default分支能夠防止這個警告)。超出枚舉范圍的case語句同樣會導致這個警告。

◆strict-aliasing:對變量別名進行最嚴格的檢查。

◆unknown-pragmas:使用了不允許的#pragma。

◆Uninitialized:在初始化之前就使用自動變量。

需要注意的是,各警告選項既然能使之生效,當然也能使之關閉 。比如假設我們想要使用-Wall來啟用個選項,同時又要關閉unused警告,利益通過下面的命令來達到目的:

$ gcc -Wall -Wno-unused test.c -o test

下面是使用-Wall選項的時候沒有生效的一些警告項:

◆cast-align:一旦某個指針類型強制轉換時,會導致目標所需的地址對齊邊界擴展,編譯器就發出警告。例如,某些機器上只能在2或4字節邊界上訪問整數,如果在這種機型上把char *強制轉換成int *類型, 編譯器就發出警告。

◆sign-compare:將有符號類型和無符號類型數據進行比較時發出警告。

◆missing-prototypes :如果沒有預先聲明函數原形就定義了全局函數,編譯器就發出警告。即使函數定義自身提供了函數原形也會產生這個警告。這樣做的目的是檢查沒有在頭文件中聲明的全局函數。

◆Packed:當結構體帶有packed屬性但實際并沒有出現緊縮式給出警告。

◆Padded:如果結構體通過充填進行對齊則給出警告。

◆unreachable-code:如果發現從未執行的代碼時給出警告。

◆Inline:如果某函數不能內嵌(inline),無論是聲明為inline或者是指定了-finline-functions 選項,編譯器都將發出警告。

◆disabled-optimization:當需要太長時間或過多資源而導致不能完成某項優化時給出警告。

上面是使用-Wall選項時沒有生效,但又比較常用的一些警告選項。本文中要介紹的最后一個常用警告選項是-Werror。使用該選項后,GCC發現可疑之處時不會簡單的發出警告就算完事,而是將警告作為一個錯誤而中斷編譯過程。該選項在希望得到高質量代碼時非常有用。

六、小結

本文介紹了GCC的基本編譯過程和編譯模式,并詳細闡述了GCC的一些常用選項以及警告功能。這些是在利用GCC進行應用編程時最基本也最常用的一些內容,我們會在后續文章中繼續介紹GCC的調試和優化技術。
該命令將同時編譯三個源文件,即first.c、second.c和 third.c,然后將它們連接成一個可執行程序,名為test。

附錄:

[參數詳解]?????
?? -x??? language??? filename???????
??   ??? 設定文件所使用的語言,使后綴名無效,對以后的多個有效.也就是根?????
??   ??? 據約定c語言的后綴名稱是.c的,而c++的后綴名是.c或者.cpp,如果?????
??   ??? 你很個性,決定你的c代碼文件的后綴名是.pig??? 哈哈,那你就要用這?????
??   ??? 個參數,這個參數對他后面的文件名都起作用,除非到了下一個參數?????
??   ??? 的使用。?????
??   ??? 可以使用的參數嗎有下面的這些?????
??     ??? `c,??? `objective-c,??? `c-header,??? `c++,??? `cpp-output,???????
??     ??? `assembler,??? and??? `assembler-with-cpp.?????
??   ??? 看到英文,應該可以理解的。?????
??   ??? 例子用法:?????
??   ??? gcc??? -x??? c??? hello.pig?????
??   ?????
?? -x??? none??? filename?????
??   關掉上一個選項,也就是讓gcc根據文件名后綴,自動識別文件類型?????
??   例子用法:?????
??   gcc??? -x??? c??? hello.pig??? -x??? none??? hello2.c?????
??   ?????
?? -c???????
??   只激活預處理,編譯,和匯編,也就是他只把程序做成obj文件?????
??   例子用法:?????
??   gcc??? -c??? hello.c?????
??   他將生成.o的obj文件???????
????
?? -s?????
??   只激活預處理和編譯,就是指把文件編譯成為匯編代碼。?????
??   例子用法?????
??   gcc??? -s??? hello.c?????
??   他將生成.s的匯編代碼,你可以用文本編輯器察看?????
????
?? -e?????
??   只激活預處理,這個不生成文件,你需要把它重定向到一個輸出文件里?????
??   面.?????
??   例子用法:?????
??   gcc??? -e??? hello.c??? >??? pianoapan.txt?????
??   gcc??? -e??? hello.c??? |??? more?????
??   慢慢看吧,一個hello??? word??? 也要與處理成800行的代碼?????
????
?? -o?????
??   制定目標名稱,缺省的時候,gcc??? 編譯出來的文件是a.out,很難聽,如果?????
??   你和我有同感,改掉它,哈哈?????
??   例子用法?????
??   gcc??? -o??? hello.exe??? hello.c??? (哦,windows用習慣了)?????
??   gcc??? -o??? hello.asm??? -s??? hello.c?????
????
?? -pipe?????
??   使用管道代替編譯中臨時文件,在使用非gnu匯編工具的時候,可能有些問?????
??   題?????
??   gcc??? -pipe??? -o??? hello.exe??? hello.c?????
????
?? -ansi?????
??   關閉gnu??? c中與ansi??? c不兼容的特性,激活ansi??? c的專有特性(包括禁止一?????
??   些asm??? inline??? typeof關鍵字,以及unix,vax等預處理宏,?????
????
?? -fno-asm?????
??   此選項實現ansi選項的功能的一部分,它禁止將asm,inline和typeof用作?????
??   關鍵字。?????
??     ?????
?? -fno-strict-prototype?????
??   只對g++起作用,使用這個選項,g++將對不帶參數的函數,都認為是沒有顯式?????
??   的對參數的個數和類型說明,而不是沒有參數.?????
??   而gcc無論是否使用這個參數,都將對沒有帶參數的函數,認為城沒有顯式說?????
??   明的類型?????
??   ?????
?? -fthis-is-varialble?????
??   就是向傳統c++看齊,可以使用this當一般變量使用.?????
??   ?????
?? -fcond-mismatch?????
??   允許條件表達式的第二和第三參數類型不匹配,表達式的值將為void類型?????
??   ?????
?? -funsigned-char?????
?? -fno-signed-char?????
?? -fsigned-char?????
?? -fno-unsigned-char?????
??   這四個參數是對char類型進行設置,決定將char類型設置成unsigned??? char(前?????
??   兩個參數)或者??? signed??? char(后兩個參數)?????
??   ?????
?? -include??? file?????
??   包含某個代碼,簡單來說,就是便以某個文件,需要另一個文件的時候,就可以?????
??   用它設定,功能就相當于在代碼中使用#include<filename>?????
??   例子用法:?????
??   gcc??? hello.c??? -include??? /root/pianopan.h?????
??   ?????
?? -imacros??? file?????
??   將file文件的宏,擴展到gcc/g++的輸入文件,宏定義本身并不出現在輸入文件?????
??   中?????
??   ?????
?? -dmacro?????
??   相當于c語言中的#define??? macro?????
??   ?????
?? -dmacro=defn?????
??   相當于c語言中的#define??? macro=defn?????
??   ?????
?? -umacro?????
??   相當于c語言中的#undef??? macro?????
????
?? -undef?????
??   取消對任何非標準宏的定義?????
??   ?????
?? -idir?????
??   在你是用#include"file"的時候,gcc/g++會先在當前目錄查找你所制定的頭?????
??   文件,如果沒有找到,他回到缺省的頭文件目錄找,如果使用-i制定了目錄,他?????
??   回先在你所制定的目錄查找,然后再按常規的順序去找.?????
??   對于#include<file>,gcc/g++會到-i制定的目錄查找,查找不到,然后將到系?????
??   統的缺省的頭文件目錄查找?????
??   ?????
?? -i-?????
??   就是取消前一個參數的功能,所以一般在-idir之后使用?????
??   ?????
?? -idirafter??? dir?????
??   在-i的目錄里面查找失敗,講到這個目錄里面查找.?????
??   ?????
?? -iprefix??? prefix?????
?? -iwithprefix??? dir?????
??   一般一起使用,當-i的目錄查找失敗,會到prefix+dir下查找?????
??   ?????
?? -nostdinc?????
??   使編譯器不再系統缺省的頭文件目錄里面找頭文件,一般和-i聯合使用,明確?????
??   限定頭文件的位置?????
??   ?????
?? -nostdin??? c++?????
??   規定不在g++指定的標準路經中搜索,但仍在其他路徑中搜索,.此選項在創建?????
??   libg++庫使用?????
??   ?????
?? -c?????
??   在預處理的時候,不刪除注釋信息,一般和-e使用,有時候分析程序,用這個很?????
??   方便的?????
??   ?????
?? -m?????
??   生成文件關聯的信息。包含目標文件所依賴的所有源代碼?????
??   你可以用gcc??? -m??? hello.c來測試一下,很簡單。?????
??   ?????
?? -mm?????
??   和上面的那個一樣,但是它將忽略由#include<file>造成的依賴關系。?????
??   ?????
?? -md?????
??   和-m相同,但是輸出將導入到.d的文件里面?????
??   ?????
?? -mmd?????
??   和-mm相同,但是輸出將導入到.d的文件里面?????
??   ?????
?? -wa,option?????
??   此選項傳遞option給匯編程序;如果option中間有逗號,就將option分成多個選?????
??   項,然后傳遞給會匯編程序?????
??   ?????
?? -wl.option?????
??   此選項傳遞option給連接程序;如果option中間有逗號,就將option分成多個選?????
??   項,然后傳遞給會連接程序.?????
??   ?????
????
?? -llibrary???????
??   制定編譯的時候使用的庫?????
??   例子用法?????
??   gcc??? -lcurses??? hello.c?????
??   使用ncurses庫編譯程序?????
??   ?????
?? -ldir?????
??   制定編譯的時候,搜索庫的路徑。比如你自己的庫,可以用它制定目錄,不然?????
??   編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。?????
??   ?????
?? -o0?????
?? -o1?????
?? -o2?????
?? -o3?????
??   編譯器的優化選項的4個級別,-o0表示沒有優化,-o1為缺省值,-o3優化級別最?????
??   高  ?????
??   ?????
?? -g?????
??   只是編譯器,在編譯的時候,產生條是信息。?????
??   ?????
?? -gstabs?????
??   此選項以stabs格式聲稱調試信息,但是不包括gdb調試信息.?????
??   ?????
?? -gstabs+?????
??   此選項以stabs格式聲稱調試信息,并且包含僅供gdb使用的額外調試信息.?????
??   ?????
?? -ggdb?????
??   此選項將盡可能的生成gdb的可以使用的調試信息.?


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454848.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454848.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454848.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java 井字棋 人機_井字游戲 人機對戰 java實現

package com.ecnu.Main;/*** 主函數觸發游戲*/public class MainApplication {public static void main(String[] args){TicTacToeGame ticTacToeGame new TicTacToeGame();ticTacToeGame.start();}}//TicTacToeGame 方法類import java.util.Scanner;public class TicTacToeGa…

Session(數據)共享的前后端分離Shiro實戰

1&#xff0c;前言本文期望描述如何使用Shiro構建基本的安全登錄和權限驗證。本文實戰場景有如下特殊需求&#xff1a;1&#xff0c;在集群和分布式環境實現session共享&#xff1b;2&#xff0c;前端只使用HTML/CSS/JS。因此無法直接使用Shiro提供的SessionManager&#xff0c…

讀書筆記(javascript 高級程序設計)

一. 數據類型&#xff1a; 1. undefined&#xff1a; 未聲明和未初始化的變量&#xff0c;typeof 操作符返回的結果都是 undefined&#xff1b;&#xff08;建議未初始化的變量進行顯式賦值&#xff0c;這樣當 typeof 返回 undefined 時就知道是未聲明了&#xff0c;幫助定位問…

關于gcc擴展中的宏定義中用 # 和 ##

關于gcc擴展中的宏定義中用 "#" 和 "##"今天測試了宏定義中的 "#" 和 "##" 的區別。 結果如下&#xff1a; "#" 代表和一個字符串相連接 "##" 代表和一個符號連接&#xff0c;符號可以是變量&#xff0c;或另一…

java 年計算_java實現計算某年某月的天數

在計算某年某月的天數時&#xff0c;需要注意平年閏年。分析&#xff1a;閏年具體的判定方法就要看它的判定條件&#xff1a;四年一閏 &#xff0c; 百年不閏 &#xff0c;400年再閏。而計算該年該月的天數&#xff0c;又分大月和小月&#xff0c;特殊月份2月之分。(視頻教程推…

添加自定義菜單,報錯40155

2019獨角獸企業重金招聘Python工程師標準>>> 提交的json中&#xff0c;某個自定義菜單對應的URL訪問是有問題的&#xff0c;請挨個檢查一下。 轉載于:https://my.oschina.net/selly1025/blog/1551496

gcc編譯流程及中間表示層RTL的探索

gcc編譯流程及中間表示層RTL的探索收藏新一篇: 解讀VC編程中的文件操作API和CFile類 | 舊一篇: Effective Item21 盡可能使用const 內容摘要 本文將以 C 語言為例&#xff0c;介紹 gcc 在接受一個 .c文件的輸入之后&#xff0c;其前端是如何進行處理并得到一個中間表示并轉交給…

【bzoj2132】圈地計劃 網絡流最小割

題目描述 最近房地產商GDOI(Group of Dumbbells Or Idiots)從NOI(Nuts Old Idiots)手中得到了一塊開發土地。據了解&#xff0c;這塊土地是一塊矩形的區域&#xff0c;可以縱橫劃分為NM塊小區域。GDOI要求將這些區域分為商業區和工業區來開發。根據不同的地形環境&#xff0c;每…

python爬蟲爬取數據如何將br去掉_Python怎么去除爬取下來的網站中的一些轉義字符串 - 收獲啦...

基本方法其實用python爬取網頁很簡單&#xff0c;只有簡單的幾句話這樣就可以獲得到頁面的內容。接下來再用正則匹配去匹配所需要的內容就行了。但是&#xff0c;真正要做起來&#xff0c;就會有各種各樣的細節問題。2.登錄這是一個需要登錄認證的網站。也不太難&#xff0c;只…

Linux基礎

Linux的特點&#xff1a; 系統版本&#xff1a;常見的有debian、Redhat更適合做服務器&#xff0c;更安全和穩定&#xff0c;Ubuntu唯一的優勢就是圖形界面好&#xff0c;centos目前被redhat收購&#xff0c;紅旗已經倒閉。 1、免費的/開源的&#xff1b;2、支持多線程/多用戶&…

GCC的編譯和調試--入門介紹

編譯與調試1.1編譯的概念和理解在進行C程序開發時&#xff0c;編譯就是將編寫的C語言代碼變成可執行程序的過程&#xff0c;這一過程是由編譯器來完成的。編譯器就是完成程序編譯工作的軟件&#xff0c;在進行程序編譯時完成了一系列復雜的過程。1.1.1程序編譯的過程在執行這一…

A* a=new B ,會不會產生內存泄露了,露了B-A的部分?

A* anew B ,delete a;會不會產生內存泄露了&#xff0c;露了B-A的部分。其中B為A的子類 析構函數在下邊3種情況時被調用&#xff1a;1.對象生命周期結束&#xff0c;被銷毀時&#xff1b;2.delete指向對象的指針時&#xff0c;或delete指向對象的基類類型指針&#xff0c;而其基…

spring 第一天:1015

對象加強的三種方法&#xff1a;1/繼承2/裝飾著模式3/動態調用 2&#xff1a;裝飾著模式&#xff1a;就是就是1-先建一個基類 &#xff0c;如咖啡類 。味道很苦2- 再建一個類配料類 也就是說是所欲配料種類的父類。然后寫多配料子類個子類繼承配料類&#xff0c;。3-子類三個步…

java public 繼承_java繼承問題

代碼&#xff1a;父類&#xff1a;public class Father {public Father() {System.out.println("基類構造函數{");show();new a();System.out.println("}");}public void show() {System.out.println("基類----show");}public class a {public a…

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數(數位DP+惡心細節)

BZOJ 1662: [Usaco2006 Nov]Round Numbers 圓環數 Time Limit: 5 Sec Memory Limit: 64 MBDescription 正如你所知&#xff0c;奶牛們沒有手指以至于不能玩“石頭剪刀布”來任意地決定例如誰先擠奶的順序。她們甚至也不能通過仍硬幣的方式。 所以她們通過"round number&q…

Optimizing Code with GCC

現在的編譯器越來越聰明&#xff0c;功能越來越強&#xff0c;從簡單的函數內聯&#xff0c;到復雜的寄存器分析&#xff0c;一系列代碼革命使程序運行得越來越快。大多數時候&#xff0c;更快比更小重要&#xff0c;因為磁盤空間和內存都變得便宜了。但是在嵌入式系統里&#…

QTP的那些事--操作excel的函數

1: QTP Excel函數 操作EXCEL 數據表格 表單 編輯EXCEL 工作表 2: Dim ExcelApp As Excel.Application 3: Dim excelSheet As Excel.worksheet 4: Dim excelBook As Excel.workbook 5: Dim fso As scrīpting.FileSystemObject 6: 7: ******************…

java-生產者消費者模式

經常會有公司叫我們手撕代碼&#xff0c;比如網易&#xff0c;阿里&#xff0c;那我們是不是該掌握下呢。下面這段代碼來自《現代操作系統》進程與線程P49頁。 public class ProducerConsumer {public ProducerConsumer() { }private static final int N 100;static Producer …

yum查詢已經安裝mysql_通過yum安裝mysql

在linux中安裝數據庫首選MySQL&#xff0c;Mysql數據庫的第一個版本就是發行在Linux系統上&#xff0c;其他選擇還可以有postgreSQL&#xff0c;oracle等在Linux上安裝mysql數據庫&#xff0c;我們可以去其官網上下載mysql數據庫的rpm包&#xff0c;http://dev.mysql.com/downl…

koa2-cookie-session

node.js的path.extname方法使用   由于該方法屬于path模塊&#xff0c;使用前需要引入path模塊&#xff08;var path require(“path”) &#xff09;   接收參數&#xff1a;   p path 路徑 path.extname(index.html)// returns.htmlpath.extname(index.)// returns.pat…