2015-01-26 4 views
1

я написал следующее Makefile:Make не модифицирует исполняемый файл

CC=g++ 

all: happy 

happy: happy.o HappyLetter.o 
     $(CC) -o happy happy.o HappyLetter.o 

happy.o: happy.cpp 
     $(CC) -c happy.cpp 

HappyLetter.o: HappyLetter.cpp 
     $(CC) -c HappyLetter.cpp 

clean: 
     rm -rf *.o happy 

и работает с файлами HappyLetter.cpp и happy.cpp (который включает в себя бывший), чтобы создать исполняемый файл с именем счастливой.

Я могу построить код успешно используя make. Однако, когда я изменяю HappyLetter.cpp и снова набираю 'make', это изменение не отражается. Он работает только тогда, когда я печатаю «make clean», а затем «make». Обновление файла объекта, который я ожидаю иметь место вторит в командной строке:

$ make 
g++ -c HappyLetter.cpp 
g++ -o happy happy.o HappyLetter.o 

Однако обновление HappyLetter.cpp не отражается в счастливой.

Проблема не работает в другом направлении. То есть, если я изменяю happy.cpp, изменение отражается сразу после ввода «make».

Я реплицировал эту проблему с тремя make-файлами на моем Mac OS X, а также на машине Ubuntu. Поэтому я должен делать что-то неправильно в кодировании. Вот текст из файлов, которые находятся в том же каталоге, что и Makefile:

happy.cpp

#include "HappyLetter.cpp" 

int main() 
{ 
    printf("Hello from happy.cpp!\n"); 
    HappyLetter *myObj = new HappyLetter(); 
    myObj->speak(); 
    return 0; 
} 

HappyLetter.cpp

#include <cstdio> 

class HappyLetter { 
    public: 
    void speak() 
    { 
     printf("Hello from HappyLetter.cpp!\n"); 
    } 
}; 

Я считаю, что проблема что-то простое, но у меня нет больше идей о том, что проверить. Одно из предположений, которое я имею, заключается в том, что порядок правил и зависимостей не имеет значения.

+0

Используйте [переделку] (http://bashdb.sourceforge.net/remake/) '' -x' или сделать - -trace'; также улучшите свой 'Makefile' как [здесь] (http://stackoverflow.com/a/20146082/841108); попробуйте также 'touch HappyLetter.cpp' перед повторным запуском' make' –

+0

Вы должны * не * '#include" HappyLetter.cpp "' рядом с началом 'happy.cpp'; вы должны иметь заголовочный файл 'happy.h', иметь' #include "happy.h" 'как' HappyLetter.cpp', так и 'happy.cpp' и изменять свой' Makefile' –

ответ

0

Как я заметил:

Во-первых, вы должны (обычно) не #include "HappyLetter.cpp" в вашем happy.cpp (даже если это выполнимо, но плохой вкус). Вы должны иметь отдельный заголовочный файл (с обычным include guard)

#ifndef HAPPY_INCLUDED 
//// file happy.h 
#define HAPPY_INCLUDED 
    class HappyLetter { 
public: 
    void speak(); 
}; 
#endif /*HAPPY_INCLUDED*/ 

(Вы можете -или not- решить, например, #include <cstdio> в вашем happy.h перед class HappyLetter, есть веские причины, чтобы сделать оба пути!)

Тогда вы должны иметь первый исходный файл:

// file happy.cpp 
#include <cstdio> 
#include "happy.h" 
int main() { 
    printf("Hello from happy.cpp!\n"); 
    HappyLetter *myObj = new HappyLetter(); 
    myObj->speak(); 
    delete myObj; 
    return 0; 
} 

BTW, вы должны использовать smart pointers!

Тогда у вас есть второй исходный файл:

// file happyletter.cpp 
#include <cstdio> 
#include "happy.h" 

void HappyLetter::speak() { 
    printf("Hello from HappyLetter.cpp!\n"); 
} 

наконец, Makefile (см here для вдохновения), как:

# file Makefile 
CXX= g++ 
CXXFLAGS= -std=c++11 -Wall -Wextra -g 
RM= rm -f 
.PHONY: all clean 

all: happy-prog 

clean: 
    $(RM) *.o *~ happy-prog 

happy-prog: happy.o happyletter.o 

happy.o: happy.cpp happy.h 
happyletter.o: happyletter.cpp happy.h 

Обратите внимание на явное зависимость от happy.h заголовка

Как я уже говорил, рассмотрим использование remake-x или make --trace для отладки вашего Makefile. Обратите внимание, что GNU make имеет множество встроенных правил, запустите make -p, чтобы получить их.

Подробнее о C++11, знатно tutorial, хорошая programming in C++ книги, есть взгляд в стандарт (например n3337 проекта). Читайте также о make, в частности GNU make.

Изучите исходный код некоторых существующих free software, закодированных в C++ (см. sourceforge или github и т. Д.), Чтобы найти его).

(так что вы получили оба ваших C++ исходных файлов и вашего Makefile неправильно!)

+0

Спасибо за вежливый и тщательный ответ ! Моя проблема решена. Я буду следить за вашими рекомендациями для изучения. – Mark

+0

Из любопытства вы изучаете программирование на C++ или учили ли вы программирование на каком-то другом языке? –

+0

Я изначально изучил программирование на C. – Mark

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