Ошибка make-файла: неопределенная ссылка на main

Я пытаюсь скомпилировать свой кусок кода, используя make. Обычно я компилирую свой код так:

mipsisa32r2el-timesys-linux-gnu-g++ -o testing -I/usr/include/libxml2 -L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include db.cpp main.cpp networkinterfacemodule.cpp network.cpp multiplex.cpp program.cpp service.cpp -lsqlite3 -lxml2

Чтобы избавиться от этой длинной команды, я попытался написать make-файл:

CC= mipsisa32r2el-timesys-linux-gnu-g++

export LD_LIBRARY_PATH=:/parsecpp/sqlite-mips2/lib:/parsecpp/lib:/tmp/vixs_temp/DirectFB/single_core/lib


CFLAGS=-I/usr/include/libxml2 -I/develop/xc4/rootfs/parsecpp/sqlite-mips2/include

LDFLAGS=-L/develop/xc4/rootfs/parsecpp/lib -L/develop/xc4/rootfs/parsecpp/sqlite-mips2/lib

LIBS = -lsqlite3 -lxml2

PROG=testing

all: main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o
    $(CC) -o $(PROG) $(CFLAGS) $(LDFLAGS)  main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o $(LIBS) 

main.o: main.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) main.cpp db.cpp networkinterfacemodule.cpp mod.cpp multiplex.cpp network.cpp program.cpp service.cpp $(LIBS)

db.o: db.cpp 
    $(CC) $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS)


mod.o: mod.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) mod.cpp $(LIBS)

multiplex.o: multiplex.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) multiplex.cpp $(LIBS)

network.o: network.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) network.cpp $(LIBS)

networkmoduleinterface.o: networkinterfacemodule.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) networkinterfacemodule.cpp $(LIBS)

program.o: program.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) program.cpp $(LIBS)

service.o: service.cpp
    $(CC) $(CFLAGS) $(LDFLAGS) service.cpp $(LIBS)

clean:
    rm -rf *o testing

Тогда я получаю эту ошибку:

/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start':
(.text+0xc): undefined reference to `main'
/opt/timesys/linux-gnu/toolchain/bin/../../toolchain/lib/crt1.o: In function `__start':
(.text+0x10): undefined reference to `main'
collect2: ld returned 1 exit status
make: *** [db.o] Error 1

Кто-нибудь может мне помочь?

 unkulunkulu27 июн. 2012 г., 13:30
@ R.MartinhoFernandes, но это должно сэкономить время компиляции, не важно. Однако это можно было бы написать гораздо более компактно, конечно.
 sth27 июн. 2012 г., 13:29
rm -rf *o testing: Вы действительно хотите удалить все файлы и каталоги, заканчивающиеся символом & quot; o & quot ;?
 R. Martinho Fernandes27 июн. 2012 г., 13:29
Мне нравится, что make-файл в несколько раз длиннее всей команды.
 David Rodríguez - dribeas27 июн. 2012 г., 13:35
%.o:%.cpp,%.h\n\t$(CC) $(CFLAGS) -c -o %< (где\n это новая линия и\t является символом табуляции) является общим правилом дляcompile (IIRC, проверьте руководство), которое может заменить все ваши вручную развернутые правила для компиляции каждого модуля перевода.
 nic27 июн. 2012 г., 13:31
@sth На самом деле это не имеет значения

Ответы на вопрос(3)

Решение Вопроса

когда вы просто компилируете файл и не связываете его, используйте & quot; -c & quot; флаг.

Например :-

db.o: db.cpp 
$(CC) -c $(CFLAGS) $(LDFLAGS) db.cpp $(LIBS)

Кроме того, во время компиляцииno need предоставить & quot; $ (LIBS) & quot; компилятору, только предоставьте их при компоновке. Также вам не нужны флаги компоновщика, поскольку компоновщик не вызывается при использовании & quot; -c & quot; флаг.

Чтобы ты мог написать,

 db.o: db.cpp 
 $(CC) -c $(CFLAGS) db.cpp

ОБНОВЛЕНО (на основе комментариев): -

При связывании файлов компоновщик ожидает один и только одинmain функция. В приведенном выше случае основная функция не определена вdb.cpp и, следовательно, хотя компиляция завершается успешно, компоновщик выдает ошибку, так как не может найтиmain функция.

 27 июн. 2012 г., 13:33
Программы на C / C ++ требуют отправной точки, которая являетсяmain функция. Когда программа компилируетсяand связанный, компилятор требует этого "основного" функция должна быть определена. В вашем случае отдельный файл компилируется и связывается, но он не содержит "main" функция (это то, что я предполагаю из ошибки), следовательно, ошибка.
 27 июн. 2012 г., 13:32
+1 Кроме того, вы можете избежать значительной части затрат на написание make-файла, написав правила (или позволив правилам по умолчанию работать.
 27 июн. 2012 г., 13:31
Это нормально. Но вопрос в том, почему не получится связать, если это сделает OP?
 27 июн. 2012 г., 13:33
@ DavidRodr & # xED; guez-dribeas, я думаю Наваз это знает, он просто хочет, чтобы это было частью ответа.
 27 июн. 2012 г., 13:32
@Nawaz: если вы попытаетесьlink каждая единица перевода сама по себе компоновщик не сможет найтиmain функция, которая присутствует только в одной из единиц перевода.

gcc пытается связать программу. Поскольку основная функция, скорее всего, находится в main.c, а не в db.c, компоновщик завершается ошибкой при поиске основной функции в db.c. Это означает, что вам нужно сообщить компилятору, что вы просто хотите вывод, который еще не связан, но переведен в объектный файл, и это именно то, что делает флаг -c.

это приводит к тому, что раджатхандуя сказал:

db.o: db.cpp 
$(CC) -c $(CFLAGS) db.cpp

Вы должны иметь первое правило, говорящее make, как связать:

testing_OBJECTS = main.o db.o mod.o multiplex.o network.o networkinterfacemodule.o program.o service.o

testing$(EXEEXT): $(testing_OBJECTS)
    ld $(testing_OBJECTS) $(LDFLAGS) $(LIBS)

А такжеthis Правило должно быть предварительным условиемall:

all: testing$(EXEEXT)

Кроме того, как все ваши & quot; *. O: * .cpp & quot; правила идентичны, вы можете указать одно правило и позволитьmake заменить имена файлов для вас. Спросите, хотите ли вы больше данных на нем.

Ваш ответ на вопрос