2015-09-06 4 views
0

Я пытаюсь понять нашу ошибку, которую я продолжаю получать с помощью make. У меня есть несколько исходных файлов, расположенных в каталоге assign1, а также каталог includes (содержит bb.h). То, что я пытаюсь сделать, это включить заголовочный файл bb.h, когда я создаю файл gq.o. Все остальные объектные файлы скомпилироваться кроме gq.o из-за этой ошибки:Ошибки каталога заголовков Makefile

[email protected]:~/assign1/assign1$ make 
g++ -c fr.cc 
g++ -c vw.cc 
g++ -c ac.cc 
g++ -c pg.cc 
g++ -c gq.cc -I./includes 
g++ -o output fr.o gq.o vw.o ac.o pg.o 
gq.o: In function `main': 
gq.cc:(.text+0x0): multiple definition of `main' 
fr.o:fr.cc:(.text+0x0): first defined here 
vw.o: In function `main': 
vw.cc:(.text+0x0): multiple definition of `main' 
fr.o:fr.cc:(.text+0x0): first defined here 
collect2: error: ld returned 1 exit status 
Makefile:12: recipe for target 'output' failed 
make: *** [output] Error 1 

это мой Makefile:

output: fr.o vw.o ac.o pg.o gq.o 
     g++ -o fr.o gq.o vw.o ac.o pg.o output 

fr.o: fr.cc pg.h 
     g++ -c fr.cc 

vw.o: vw.cc ac.h 
     g++ -c vw.cc 

ac.o: ac.cc ac.h pg.h 
     g++ -c ac.cc 

pg.o: pg.cc pg.h 
     g++ -c pg.cc 

gq.o: gq.cc ac.h includes/bb.h 
     g++ -c gq.cc -I./includes/bb.h 

clean: 
     -rm *.o 

fr.cc, gq.cc and vw.cc all have main functions inside each of them. 
ac.cc and fr.cc both have fl(); function they have in common. 
gq.cc and vw.cc both have x2(); function they have in common. 

Я не разрешено редактировать любой из перечисленных ниже файлов. Цель состоит в создании make-файла, поэтому, если файл bb.h должен быть изменен кем-то, тогда make-файл будет работать.

Вот структура файла для каждого файла:

ac.cc

#include "ac.h" 
#include "pg.h" 
#include <iostream> 
using std::cout; 
using std::endl; 

void y7(void) 
{ 
    cout << "y7()" << endl; 
} 

void x2(void) 
{ 
    cout << "x2()" << endl; 
    f1(); 
} 

ac.h

void y7(void); 

void x2(void); 

fr.cc

#include <iostream> 
using std::cout; 
using std::endl; 

#include "pg.h" 

int main() 
{ 
    cout << "program fr" << endl; 

    f1(); 

    return 0; 

} 

GQ. cc

#include <iostream> 
using std::cout; 
using std::endl; 

#include "ac.h" 
#include "bb.h" 

int main() 
{ 
    cout << "program gq" << endl; 

    x2(); 

    cout << "CONST111: " << CONST111 << endl; 
    cout << "CONST222: " << CONST222 << endl; 

    return 0; 

} 

pg.cc

#include "pg.h" 
#include <iostream> 
using std::cout; 
using std::endl; 

void f1(void) 
{ 
    cout << "f1()" << endl; 
} 

void g3(void) 
{ 
    cout << "g3()" << endl; 
} 

pg.h

void f1(void); 

void g3(void); 

vw.cc

#include <iostream> 
using std::cout; 
using std::endl; 

#include "ac.h" 

int main() 
{ 
    cout << "program vw" << endl; 

    x2(); 

    return 0; 

} 

включает в себя/bb.h

define CONST111 42 
#define CONST222 84 
+0

Это неверно: '-I./Includes/bb.h', он должен указывать только на * каталог *, а не на файл:' -I./Includes'. Конечно, 'bb.h' должен существовать в этом каталоге. – Galik

+0

ok Я исправил эту проблему с вашим предложением, теперь я получаю: g ++ -o fr.o gq.o vw.o ac.o pg.o output g ++: error: output: Нет такого файла или каталога Makefile: 12 : рецепт для целевого «выхода» не выполнен make: *** [output] Ошибка 1 – user3325133

+0

** Изменение: ** 'g ++ -o fr.o gq.o vw.o ac.o pg.o output' ** to : ** 'g ++ -o output fr.o gq.o vw.o ac.o pg.o' – Galik

ответ

0

я могу видеть, по крайней мере, две ошибки в этом Makefile, но его невозможно сказать, не зная расположение файла:

Вот мои исправления:

output: fr.o vw.o ac.o pg.o gq.o 
     g++ -o output fr.o gq.o vw.o ac.o pg.o 

fr.o: fr.cc pg.h 
      g++ -c fr.cc 

vw.o: vw.cc ac.h 
      g++ -c vw.cc 

ac.o: ac.cc ac.h pg.h 
      g++ -c ac.cc 

pg.o: pg.cc pg.h 
      g++ -c pg.cc 

gq.o: gq.cc ac.h includes/bb.h # need to give path to bb.h 
      g++ -c gq.cc -I./includes 

clean: 
      -rm *.o 

Если у вас есть проблемы, разместить свой формат файла Вы можете использовать это:

find . 

в вашей папке проекта.

+0

Я добавил находку. выше, если вы можете помочь мне понять это, я бы очень признателен. – user3325133

+0

@ user3325133 Вы должны добавить свою файловую структуру в исходный вопрос. Я пересмотрел свой ответ так, чтобы он строился с файловой структурой, которую вы опубликовали. Я пропустил полный (относительный) путь к 'bb.h'. – Galik

+0

Я добавил файловую структуру для каждого файла, можете ли вы помочь мне скомпилировать make-файл? – user3325133

1

Изменить

gq.o: gq.cc ac.h bb.h 
     g++ -c gq.cc -I./includes/bb.h 

в

gq.o: gq.cc ac.h 
     g++ -c gq.cc -I./includes 

или

gq.o: gq.cc ac.h includes/bb.h 
     g++ -c gq.cc -I./includes 

Причина ваш билд неудачу из-за bb.h не находится в том же каталоге. Вы указываете bb.h как требование, и поскольку его нет, сделайте попытки его генерировать, но не найдете подходящего правила. Вам нужно либо не перечислить bb.h в качестве требования, либо указать файл со своим путем, чтобы make увидел, что он существует. Кроме того, необходимо использовать только -I./includes указать каталог поиска, г ++ будет искать bb.h в

Вам также необходимо изменить следующим образом:.

output: fr.o vw.o ac.o pg.o gq.o 
    g++ -o fr.o gq.o vw.o ac.o pg.o output 

, который имеет много проблем.Прежде всего, вы пытаетесь связать объекты с конфликтующими символами, и использование флага -o неверно. На основе комментариев и ваши изменения, что я думаю, что вы хотите:

output: fr.o vw.o ac.o pg.o gq.o 
     g++ -o fr fr.o pg.o 
     g++ -o gq gq.o ac.o pq.o 
     g++ -o vw vw.o ac.o pg.o 

Это произведет три бинарных файлов, fr, gq и vw, названные в честь трех файлов с main() символами. В каждом списке перечислены объекты, необходимые для разрешения внешних символов.

+0

Я изменил это и теперь еще одна ошибка: g ++ -c fr.cc g ++ -c vw.cc g ++ - c ac.cc g ++ -c pg.cc g ++ -I./includes -c gq.cc g ++ fr.o gq.o vw.o ac.o pg.o -o output gq.o: В функции 'main ': gq.cc:(.text+0x0): множественное определение' main' fr.o: fr.cc :(. Text + 0x0): сначала определяется здесь vw.o: В функции 'main ': vw.cc:(.text+0x0): множественное определение' main' fr .o: fr.cc :(. text + 0x0): сначала определено здесь collect2: error: ld возвращено 1 статус выхода Makefile: 12: рецепт для целевого «выхода» не выполнен make: *** [output] Ошибка 1 – user3325133

+0

Я отправил вопрос с обновлениями, вы можете помочь мне понять это? – user3325133

+0

Огромное вам спасибо, он отлично компилируется. Просто быстрый вопрос, если какой-либо из исходных файлов изменится, будет ли работать снова? Кроме того, когда он компилируется, когда приходит, когда я печатаю, очищаем файлы fr, gq и vw. Разве это не должно быть очищено, а если нет, как удалить эти файлы? – user3325133

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