Проблема связана с вашей второй командой gcc
, в которой вы используете файл -o
, чтобы указать выходной файл, в котором нужно сохранить полученный исполняемый файл, но передав ему имя исходного файла C seek_io.c
вместо ...
gcc -o seek_io.c ./error_function.o
Это означает ссылка файл error_function.o
и сохранение исполняемого файла в seek_io.c
. Это не удается, потому что нет функции main
, которая необходима для отдельного исполняемого файла, поэтому исходный файл C не будет перезаписан ошибочной командой link.
Вы можете легко исправить это, передав параметру -o
правильное имя выходного файла, которое в случае (этой команды link) должно быть именем исполняемого файла, который вы хотите создать, например seek_io
:
gcc -o seek_io seek_io.c ./error_function.o
(Но это не удастся без -I ./lib/
, поскольку seek_io.c
включает в себя tlpi_hdr.h
, который находится в этом каталоге. Если вы добавите его в эту команду, он должен работать.)
Вы также можете разделить шаги компиляции и компоновки на два отдельных шага (указанная выше команда скомпилирует seek_io.c
в объектный файл, а затем link два объекта файлы в исполняемый файл) с:
$ gcc -I ./lib/ -c ./lib/error_functions.c
$ gcc -I ./lib/ -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o
И еще один последний недостаток: для флага -I
, указывающего каталоги, в которых нужно искать включаемые файлы, более распространенное использование не имеет пробела между самим флагом и именем каталога, поэтому вы чаще всего будете видеть -I./lib
или даже -Ilib
.
$ gcc -Ilib -c ./lib/error_functions.c
$ gcc -Ilib -c seek_io.c
$ gcc -o seek_io seek_io.o error_function.o