2014-02-09 77 views
2

我是makefiles的新手,剛剛創建了一個適用於C++項目的makefile。它有兩個cpp文件和一個h文件。我想轉換我的文件在Linux中工作,但似乎無法弄清楚如何。有任何想法嗎?將視覺工作室makefile轉換爲linux makefile

EXE = NumberGuessingGame.exe 
CC = cl 
LD = cl 
OBJ = game.obj userInterface.obj 
STD_HEADERS = header.h 
CFLAGS = /c 
LDFLAGS = /Fe 

$(EXE): $(OBJ) 
    $(LD) $(OBJ) $(LDFLAGS)$(EXE) 

game.obj: game.cpp $(STD_HEADERS) 
    $(CC) game.cpp $(CFLAGS) 

userInterface.obj: userInterface.cpp $(STD_HEADERS) 
    $(CC) userInterface.cpp $(CFLAGS) 

#prepare for complete rebuild 
clean: 
    del /q *.obj 
    del /q *.exe 
+1

大一:Linux中沒有'del'。或.exe ... –

+0

其rm正確?而不是del –

+0

你在linux平臺上有哪些工具? (如果您不確定,請嘗試'make -v'和'g ++ -v'。) – Beta

回答

3

對於在Linux上深入處理make,請參閱GNU make

有一些差異。二進制文件沒有擴展名

EXE = NumberGuessingGame 

編譯器是gcc,但不需要被命名,因爲CC是內置的,這同樣適用於LD。但是由於您的文件被命名爲.cpp,因此適當的編譯器爲g++,即make中的CXX

目標文件有擴展.o

OBJ = game.o userInterface.o 
STD_HEADERS = header.h 

編譯器標誌

CXXFLAGS = -c 

/Fe等效只是-o,它沒有被指定爲LDFLAGS,但鏈接器命令行上拼寫出來。

通常情況下,你使用編譯器用於連接

$(EXE): $(OBJ) 
    $(CXX) $(LDFLAGS) $(OBJ) -o $(EXE) 

你並不需要指定對象創建的規則,它們是內置的。只要指定的依賴

game.o: $(STD_HEADERS) 
userInterface.o: $(STD_HEADERS) 

del是稱爲rm

clean: 
    rm -f $(OBJ) 
    rm -f $(EXE) 

One importa nt點是,縮進是一個標籤字符,沒有空格。如果您有空格,請提出抱怨

*** missing separator. Stop. 

或其他一些奇怪的錯誤。

2

您還可以使用CMake來完成你的任務:

認沽以下到項目的根目錄下的CMakeLists.txt文件(<project-dir>):

cmake_minimum_required (VERSION 2.6) 
project (NumberGuessingGame) 
add_executable(NumberGuessingGame game.cpp serInterface.cpp) 

然後在控制檯上做

  • 「in-source」build

    $ cd <project-dir> 
    $ cmake . 
    $ make 
    
  • 或 「外源」 打造

    $ mkdir <build-dir> 
    $ cd <build-dir> 
    $ cmake <project-dir> 
    $ make 
    

可以調整生成使用漂亮的GUI工具設置。只需進入build目錄並運行cmake-gui

0

您不需要在依賴列表中包含標題。編譯器會自行失敗,停止繼續。但是,如果您將它們包含在依賴列表中以強制make重新生成文件以防頭更改,則沒有人會阻止您。

CFLAGS從不需要包含-c,LDFLAGS也不需要-o。下面是一個改進的makefile。請注意,您始終可以覆蓋在makefile中明確定義的宏,或者使用類似make CFLAGS=-Wall的內容進行隱式定義。如果您有C源文件(必須使用C編譯器(CC宏的值)而不是C++編譯器進行編譯),則使用事實上的標準CXX宏名稱。

.POSIX: 

#CC is already implicitly defined. 
CXX = g++ 
OBJ = game.o userInterface.o 
STD_HEADERS = header.h 

.SUFFIXES: 
.SUFFIXES: .o .cpp .c 

NumberGuessingGame: $(OBJ) $(STD_HEADERS) 
    $(CXX) $(CFLAGS) -o [email protected] $(OBJ) $(LDFLAGS) 

.cpp.o: $(STD_HEADERS) 
    $(CXX) $(CFLAGS) -c $< 

#There is already an implicit .c.o rule, thus there is no need for it here. 

#prepare for complete rebuild 
clean: 
    -rm -f NumberGuessingGame *.o 

正如yegorich回答的那樣,您可以使用像Cmake這樣的構建系統。它更加靈活,跨平臺,並且可以在Windows上生成Unix Makefiles以及Nmake Makefiles和Visual Studio解決方案。