2009-12-06 2 views
1

Я пытаюсь скомпилировать программу тетрис я написал с C++ и SDL на OS X. Сначала я пытался сделать это:Компиляция SDL на OS X с Makefile

`g++ -o tetris main.cpp `sdl-config --cflags --libs` -framework Cocoa` 

и получил это:

Undefined symbols: 
    "Game::startGame()", referenced from: 
     _main in ccQMhbGx.o 
    "Game::Game()", referenced from: 
     _main in ccQMhbGx.o 
ld: symbol(s) not found 
collect2: ld returned 1 exit status 

Вот файл main.cpp:

#include <iostream> 
#include "Game.h" 

int main(int argc, char* argv[]) { 
Game *game = new Game(); 
game->startGame(); 

return 0; 
} 

Game.h класс игры, где все другие классы (Board.h, IO. ч, Piece.h, Pieces.h) и основная логика игры.

Мне бы очень хотелось, чтобы иметь возможность писать make-файл для этого или найти способ легко распространять его друзьям.

EDIT:

вот окончательный 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) 
+0

Я знаю, что это старое сообщение ... но для каждого 'нового' должен быть' delete'. – gldraphael

ответ

3

Я думаю, ваша проблема компиляции связана с SDL основной функции.

Ошибка компиляции из-за того, что вам не хватает ссылок на «Game.o» или что-то, что вызвал компилятор Game.cpp. Попробуйте:

g++ -o tetris main.cpp Game.o Pieces.o Whateverelse.o `sdl-config --cflags --libs` -framework Cocoa 
+0

Спасибо за ваш ответ, но это, похоже, не так. Поскольку у меня есть несколько классов, распределенных по нескольким файлам .cpp и .h, мне нужно сделать что-то подобное для каждого из них: 'g ++' sdl-config --cflags' -c Pieces.cpp' – jluebbert

+0

Ошибка компиляции - это потому, что вам не хватает ссылок на «Game.o» или что-то, что вызвал объектный файл из компиляции Game.cpp. Попробуйте g ++ -o tetris main.cpp Game.o Pieces.o Whateverelse.o 'sdl-config --cflags --libs' -framework Cocoa – diciu

+0

Хорошо, я чувствую, что мы приближаемся. Теперь я могу скомпилировать все файлы классов в .o-файлы, кроме тех, которые имеют #include . Я получаю: 'IO.cpp: In member function 'int IO :: isKeyDown (int)': IO.cpp: 75: ошибка:« SDL_GetKeyState »не была объявлена ​​в этой области» – jluebbert

Смежные вопросы