2012-06-28 6 views
1

Я новичок в создании файлов, и я поставил это вместе с небольшим количеством пробной ошибки &. Этот код используется для компиляции моей программы на C++.Почему мой файл не оставляет объектных файлов?

Мой файл main.cpp в той же папке, что и файл makefile. У меня есть папка lib /, которая содержит основную часть заголовков.

Следующие make-файлы приводят к правильной и полной компиляции моего кода. Но я ожидал, что оставлю позади объекты. (Обратите внимание, что я пытался сделать с и без «чистых» правил, и я получаю те же результаты как раз.)

# 
# Makefile 
# 

CXX = g++ 
CCFLAGS = -O3 -I/sw/include -L/sw/lib 
     ## /sw/include and /sw/lib contain dependencies for files in my lib/ 
LDFLAGS = -lpng 
OPTS = $(CCFLAGS) $(LDFLAGS) 

SOURCES = $(wildcard lib/*.cpp) main.cpp 
OBJECTS = $(SOURCES: .cpp = .o) 
TARGET = spirals 

$(TARGET): $(OBJECTS) 
    $(CXX) $(OPTS) $^ -o [email protected] 

.PHONY: depend 
depend: 
    g++ -MM $(SOURCES) > depend 
     ## generate dependencies list 
include depend 

.PHONY: clean 
clean: 
    rm -f *.o lib/*.o $(TARGET) 

Кроме того, в случае, если это имеет значение, я на MacOSX и мои программа разработана в xcode. (Я знаю, что у xcode есть собственный поток сборки, но я разрабатываю программу командной строки для Linux-системы, и я бы хотел протестировать компиляцию &, которая связывается в среде bash, а не только через xcode.)

Вопросы:

  1. Я правильно ожидать мейкфайлы производить * .o файлы, которые торчат вокруг после того, как главная цель была создана?

  2. Если да, то почему мой makefile не делает это?

ответ

4

Если вы заметили, что команда вашей $(TARGET) правила вызывает для запуска:

g++ -O3 -I/sw/include -L/sw/lib -lpng lib/bar.cpp lib/foo.cpp main.cpp -o spirals 

вы увидите, что на самом деле $(OBJECTS) содержат * .cpp файлы, и нет * .o файлов торчащих потому что вы не просили ни о чем.

Проблема здесь:

OBJECTS = $(SOURCES:.cpp=.o) 

В вашем GNU Makefile, как написано, эта ссылка замещения записывается с избытком пространства, так что никогда не совпадает со всем и $(OBJECTS) заканчивается так же, как $(SOURCES). Перепишите его, как указано выше, и он будет делать то, что вы ожидаете.

(Другие примечания: -lpng потребность идти в конце команды ссылки на работу в целом, так что вы должны ввести другую сделать переменную (традиционно называют $(LDLIBS)) таким образом, чтобы добиться того, что главным образом в качестве кого-то нового в Makefiles, вы. лучше было бы разъяснять ваши зависимости явно, а не играть в игры с $(wildcard) и вычислять $(OBJECTS). -I параметры необходимы во время компиляции, тогда как во время компоновки используются опции -L, поэтому было бы удобно размещать отдельные переменные /$(LDFLAGS), используемые в отдельных правилах поэтому они добавляются только по мере необходимости.)

+0

Спасибо, я не понял, что t его пробелы вызывали у меня проблемы. Я также ценю ваши советы по моей компиляции и сравнению ссылок! – vanilla

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