Связывание 2 объектных файлов в c для создания исполняемого файла

У меня проблема с make-файлом для чего-то, что я делаю. Мой make-файл выглядит так

bag: main.o bow.o
    gcc bow.o main.o -o bag
main.o: main.c bow.h
    gcc -Wall -ansi -pedantic main.c -o main.o
bow.o: bow.c bow.h
    gcc -Wall -ansi -pedantic -c bow.c -o -bow.o

У меня также есть заголовочный файл с именем "bow.h", который используется в файлах bow.o и main.o. bow.h состоит из 8 определений функций и 2 структур, bow.c содержит 8 функций и файл NO MAIN. Предполагается, что main.c является минимальным основным файлом, поэтому он состоит только из

#include "bow.h"

Когда я запускаю свой make-файл в Терминале с

make

Я получаю это сообщение

/usr/lib/gcc/x86_64-linux-gnu/5/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
makefile:2: recipe for target 'bag' failed
make: *** [bag] Error 1

Что именно это означает, как это вызвано и как я могу это исправить?

1 ответ

Даже минимальной программе (исполняемой программе) требуется точка для запуска. Для программы на C это main() функция. Таким образом, компоновщик ищет эту функцию (точнее, он связывает объект запуска, где main является неразрешенным символом), не находит его и выдает ошибку.

Таким образом, вы должны предоставить main(), В качестве альтернативы вы можете создать не исполняемый файл, а библиотеку.

Другие вопросы по тегам