2017-01-07 61 views
0

我已經通過自制安裝了SDL,並將它與我的測試程序完美的作品,如果我直接在終端中輸入以下命令:SDL通過自制最大OSX,Makefile文件不太工作

g++ -O3 -g -Wall -Wextra -std=c++1y hello.cpp hello_main.cpp `sdl2-config --cflags --libs` -o hello 

但不幸的是我的嘗試編寫一個makefile(我肯定會需要一個)已經取得了不成功/無法解釋的結果。 我是這樣的,但我的配置是不同的/我沒有指定可可(我不需要),所以我期望我遇到的問題可能部分是由於我的不同要求: Compiling SDL on OS X with makefile 例如:

CC=g++ 
CFLAGS=-c -Wall 
SDLFLAGS=`sdl-config --cflags --libs` -framework Cocoa 
SOURCES=main.cpp Game.cpp IO.cpp Board.cpp Pieces.cpp Piece.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=tetris 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
$(CC) $(OBJECTS) $(SDLFLAGS) -o [email protected] 

.cpp.o: 
$(CC) $(CFLAGS) $< -o [email protected] 

clean: 
rm -rf *.o $(EXECUTABLE) 

我的makefile至今:

CXX  = g++ 
CXXFLAGS = -c -O3 -g -Wall -Wextra -std=c++1y 
SDLFLAGS = `sdl2-config --cflags --libs` 
SOURCES = hello_main.cpp hello.cpp 
OBJECTS = $(SOURCES:.cpp=.o) 
EXECNAME = hello 

all: $(SOURCES) $(EXECNAME) 

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $ (OBJECTS) $(SDLFLAGS) -o [email protected] 

.cpp.o: 
    $(CXX) $(CXXFLAGS) $< -o [email protected] 

clean : 
    -rm -f *.o *.core $(EXECNAME) 

在我.HPP的頭文件,如果我#include <SDL.h>和運行的一行命令,一切順利。如果我嘗試上面的makefile,找不到,但如果我然後將該指令更改爲#include <SDL2/SDL.h>,則會發現該庫。然而,控制檯輸出如下:

g++ -c -O3 -g -Wall -Wextra -std=c++1y hello.cpp -o hello 

這是奇數。

運行./hello會產生「權限被拒絕」錯誤,從而確認鏈接和編譯不成功。 每個人的系統都有一點不同,到目前爲止我發現的問題在這種情況下並沒有幫助。我想如果我可以從IDE中導入固定的makefile或從終端/編譯生成,那麼,我將如何開始在IDE中使用它?我很好。)

我需要做什麼makefile的變化? 謝謝。

編輯:

變化1:

CXX   = g++ 
CXXFLAGS = -O3 -g -Wall -Wextra -std=c++1y -c 
SDLCFLAGS = `sdl2-config --cflags` 
SDLLIBFLAGS = `sdl2-config --libs` 

SOURCES = hello_main.cpp hello.cpp 
OBJECTS = $(SOURCES:.cpp=.o) 
EXECNAME = hello 

all: $(SOURCES) $(EXECNAME) 

$(EXECUTABLE): $(OBJECTS) 
    $(CXX) $ (OBJECTS) $(SDLLIBFLAGS) -o [email protected] 

.cpp.o: 
$(CXX) $(CXXFLAGS) $(SDLCFLAGS) $< -o [email protected] 

clean : 
    -rm -f *.o *.core $(EXECNAME) 
+0

與'\'pkg配置--cflags SDL2 --libs試試吧\''代替。 – Manny102030

回答

0

我和一位朋友聊天,想通了什麼是錯的:一堆錯別字和規則怪異。下面的工作,爲那裏的人誰需要一個基本的Makefile:

CXX   = g++ 
CXXFLAGS = -O3 -g -Wall -Wextra -std=c++1y 
#LDFLAGS  = -lSDL2_image 
SDLCFLAGS = $(shell sdl2-config --cflags) 
SDLLIBFLAGS = $(shell sdl2-config --libs) 

SOURCES = hello_main.cpp hello.cpp 
OBJECTS = $(SOURCES:.cpp=.o) 
EXECNAME = hello 

all: $(EXECNAME) 

$(EXECNAME): $(OBJECTS) 
    $(CXX) $(OBJECTS) $(SDLLIBFLAGS) $(LDFLAGS) -o [email protected] 

%.o: %.cpp 
    $(CXX) -c $(CXXFLAGS) $(SDLCFLAGS) $< -o [email protected] 

clean : 
    -rm -f *.o *.core $(EXECNAME) 
+0

這是工作解決方案。 – synchronizer

0

你應該分裂您sdl2-config爲兩個 - 因爲有兩個步驟。 sdl2-config --cflags應該在編譯步驟中進行 - 多數民衆贊成在你的例子.cpp:.o行。那麼連接步驟應該是sdl2-config --libs。第二個對你的情況看起來很好,額外--cflags沒有傷害,但不是必需的。

+0

我不確定我是否正確解釋了您的答案。我已編輯我的問題,包括我認爲你說的,但我仍然得到控制檯輸出'g ++ -O3 -g -Wall -Wextra -std = C++ 1y -c hello.cpp -o hello'和一個' -bash:./hello:Permission denied'當我嘗試運行時。 – synchronizer

+0

嘗試'文件測試'看到操作系統說它是什麼樣的文件。也許'chmod u + x test'使它可執行,但看起來很奇怪,默認情況下它應該沒問題。 –