在用實驗室的伺服器進行c++
編譯的時候,由於沒有圖形介面,只能在shell
中進行操作,因此需要學習用gcc
(g++)
進行編譯,如果命令多的話,就要用到makefile
來完成批量的shell
命令。
《跟我一起寫makefile》
這個材料是自學寫
makefile
的優秀材料。有任何問題都可以參照。
標頭檔案不需要編譯:在看《linux
程式設計》的時候,已經知道了如何編譯目標檔案(.o)
和可執行檔案,那時候的標頭檔案只有函式的宣告,沒有函式實體,我就盲目的認為如果標頭檔案中有函式的實體的話那標頭檔案也需要先生成目標檔案(這種有函式實體的標頭檔案是不規範的,但是已有的程式就是這樣),對頭檔案(.h)
的編譯(生成.o
)是完全錯誤的,沒有必要做也不能做類似的工作。
不需要顯式指明每個檔案的標頭檔案載入:對於手上的**,除了c++
的標準庫(在標準位置),只需要新增乙個fftw3f
的庫就可以編譯成功。這些**有若干個標頭檔案和兩個.cpp
檔案,實踐證明ubuntu12.04
和redhat6.4
的make
和gcc
(g++
)都可以自動找尋.h
的匹配,不需要顯式的指明對於每個檔案的.h
載入。
於是makefile可以寫為:
libpath=-l/usr/local/lib
libname=-lfftw3f
crs:main.ostripmapimaging.o
g++ -o crs main.o stripmapimaging.o $(libpath) $(libname)
#以下可省略:
main.o:*.h
g++ -c main.cpp
stripmapimaging.o:*.h
g++ -c stripmapimaging.cpp
省略了生成.o
檔案的命令,當然也省略了標頭檔案的顯式載入宣告。
其中libpath
是libfftw3f.a
庫的路徑,main.o
和stripmapimaging.o
分別是兩個.cpp
檔案生成的目標檔案。
在make
中可以自動執行省略的部分。
只在shell中輸入命令對於只有兩個.cpp
檔案的此專案也是很簡單的:
先輸入「g++ -c main.cpp stripmapimaging.cpp」 或
「g++ -c *.cpp」
生成.o
檔案,
再輸入
「g++ -o prog main.o stripmapimaging.o -l/usr/local/lib -lfftw3f」 或
「g++ -o prog *.o -l/usr/local/lib -lfftw3f」
(注意要有prog或其他生成的可執行檔名)
同樣可以編譯成功。
make
的時候如果makefile
的檔名不是makefile
,呼叫方式為:
make-fname
要記得有-f
。
Linux 用makefile編譯程式
makefile可以方便快捷的編譯我們編寫的程式,也可以處理一些檔案,例如刪除檔案,檢視檔案。初學者對makefile的掌握如下 makefile的結構 第一行 編譯完成的檔名稱 編譯檔案所需的原始檔 第二行 游標在行首的時候按一下tab鍵,一般情況下,在vim下按完tab後,之後的字母會變成紅色 ...
編譯模組 Makefile
在makefile中我們經常看到 這幾個賦值運算子,那麼他們有什麼區別呢?我們來做個簡單的實驗 新建乙個makefile,內容為 ifdef define vre vre hello world else endif ifeq opt define vre hello world first end...
Makefile工程編譯
1.寫在前面 本篇文章講的是接前面makefile之編譯多個可執行程式中第二個需求,並延伸到對正規工程的編譯。2.工程 我接觸的工程有2種情況 所有原始檔都放乙個目錄 按模組分放不同的目錄 下面按照這兩種情況講解。3.所有原始檔都放乙個目錄 不建議所有原始檔都放乙個目錄,當工程大時,乙個目錄下會有很...