Решено: Простой Makefile

Модератор: Модераторы разделов

volod
Сообщения: 28
ОС: Mandrake 10.1

Решено: Простой Makefile

Сообщение volod »

Совсем измучился, помогите!

Например, есть проэкт где:
1) файлы *.cpp разложены по смыслу в поддиректориях
dir1/f1.cpp dir1/f2.cpp
dir2/f3.cpp dir2/f4.cpp
main1/main.cpp
2) f3.cpp использует f1.cpp и f1.h
f4.cpp использует f1.cpp, f2.cpp и f1.h f2.h
main.cpp использует f3.cpp и f4.cpp
3) все заголовки *.h собраны в папке hhh/

//-------------------------------------

Код: Выделить всё

        main.cpp (f3.h  f4.h)
         /                \
     f3.cpp (f1.h)        f4.cpp  (f1.h f2.h)
        |                 /    \
        f1.cpp        f1.cpp    f2.cpp

//-------------------------------------
Какой должен быть вид Makefile, что бы просто откомпилить такой проэкт?
Этот щаблон необходим для понимания.
Сам проэкт естетсвенно намного сложней и поэтому существует особенность-
файлы с кодом разбиты по поддиректориям согласно смысла.
Спасибо сказали:
volod
Сообщения: 28
ОС: Mandrake 10.1

Re: Решено: Простой Makefile

Сообщение volod »

АУ-у-у-у... Помогите-е-е-е... :wacko:

Вот мой бред, но он НЕ работает :angry:

Код: Выделить всё

prog:   dir2/f3.o dir2/f4.o hhh/f3.h hhh/f4.h
    g++ main1/main.cpp dir2/f3.o dir2/f3.o -o prog
f3.o:   dir1/f1.cpp hhh/f1.h
    g++ -c dir1/f1.cpp -o dir1/f1.o
    g++ -c dir2/f3.cpp dir1/f1.o -o dir2/f3.o
f4.o:   dir1/f1.cpp dir1/f2.cpp hhh/f1.h hhh/f2.h
    g++ -c dir1/f1.cpp -o dir1/f1.o
    g++ -c dir1/f2.cpp -o dir1/f2.o
    g++ -c dir2/f4.cpp dir1/f1.o dir1/f2.o -o dir2/f4.o


На выходе вот такая фигня:

Код: Выделить всё

$ make
dir2/f3.o(.text+0x0): In function `f3(double)':
: multiple definition of `f3(double)'
dir2/f3.o(.text+0x0): first defined here
/home/volod/tmp/ccdF3pV5.o(.text+0x152): In function `main':
: undefined reference to `f4(double)'
dir2/f3.o(.text+0x10): In function `f3(double)':
: undefined reference to `f1(double)'
dir2/f3.o(.text+0x10): In function `f3(double)':
: undefined reference to `f1(double)'
collect2: ld returned 1 exit status
make: *** [prog] Ошибка 1


При этом, если бросить все файлы в кучу (подредактировав заголовки)
то

Код: Выделить всё

$g++ main.cpp f1.cpp f2.cpp f3.cpp f4.cpp

без запинки компилит a.out
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Решено: Простой Makefile

Сообщение uptime »

Код: Выделить всё

prog:   dir2/f3.o dir2/f4.o hhh/f3.h hhh/f4.h
     g++ main1/main.cpp dir2/f3.o dir2/f3.o -o prog

ужос. prog - это цель, это правильно. Но зависеть она должна только от объектников (*.o). Второй строкой должен идти вызов линкера, который собирает прогу из объектников и библиотек.

Код: Выделить всё

 f3.o:   dir1/f1.cpp hhh/f1.h
     g++ -c dir1/f1.cpp -o dir1/f1.o
     g++ -c dir2/f3.cpp dir1/f1.o -o dir2/f3.o

Здесь цель - один из объектников. Он должен зависеть только от собственного исходника (f3.cpp) и упомянутых в данном исходнике заголовочных файлов.
Вторая строка лишняя. В третьей явно не нужен параметр с упоминанием f1.o.

успехов
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали:
volod
Сообщения: 28
ОС: Mandrake 10.1

Re: Решено: Простой Makefile

Сообщение volod »

uptime, СПАСИБО!!! :drinks:
ПОЛУЧИЛОСЬ! :rolleyes:

Код: Выделить всё

fobj = main1/main.o dir1/f1.o dir1/f2.o dir2/f3.o dir2/f4.o
prog:   $(fobj)
    g++ $(fobj) -o prog
f4.o:   dir2/f4.o
    g++ -c dir2/f4.cpp -o dir2/f4.o
f3.o:   dir2/f3.o
    g++ -c dir2/f3.cpp -o dir2/f3.o
f2.o:   dir1/f2.o
    g++ -c dir1/f2.cpp -o dir1/f2.o
f1.o:   dir1/f1.o
    g++ -c dir1/f1.cpp -o dir1/f1.o
Спасибо сказали:
Аватара пользователя
uptime
Сообщения: 1661
Статус: Drinker with computing problems
ОС: kubuntu 8.04

Re: Решено: Простой Makefile

Сообщение uptime »

volod
Ага, поздравления.
Только хедеры надо бы добавить в зависимости. В противном случае после редактирования хедера команда make не станет перекомпилировать исходник.
Например, так:

Код: Выделить всё

obj = main1/main.o dir1/f1.o dir1/f2.o dir2/f3.o dir2/f4.o
prog:   $(fobj)
    g++ $(fobj) -o prog
f4.o:   dir2/f4.o f1.h f2.h
    g++ -c dir2/f4.cpp -o dir2/f4.o
The answer, my friend, is blowin' in the wind.
The answer is blowin' in the wind.
Спасибо сказали: