Я пытаюсь понять нашу ошибку, которую я продолжаю получать с помощью 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
Это неверно: '-I./Includes/bb.h', он должен указывать только на * каталог *, а не на файл:' -I./Includes'. Конечно, 'bb.h' должен существовать в этом каталоге. – Galik
ok Я исправил эту проблему с вашим предложением, теперь я получаю: g ++ -o fr.o gq.o vw.o ac.o pg.o output g ++: error: output: Нет такого файла или каталога Makefile: 12 : рецепт для целевого «выхода» не выполнен make: *** [output] Ошибка 1 – user3325133
** Изменение: ** '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