Программирование Linux: компилировать код с зависимостями - PullRequest
0 голосов
/ 06 января 2019

Я новичок в программировании на Linux и изучаю его из Интерфейс программирования Linux от Michael Kerrisk .

Мне нужно скомпилировать мою первую программу с зависимостями.

Структура каталогов:

--linux-programs
  |--seek_io.c
  |--lib
    |--tlpi_hdr.h
    |--error_functions.h
    |--error_functions.c
    |--get_num.h
    |--ename.c.inc

Я хочу скомпилировать seek_io.c программу с зависимостями в каталоге lib , чтобы я мог видеть, как работает программа.

Я попробовал несколько вещей, совершенно не понимая, как они работают, следуя этому stackoverflow-ответу. Я получаю всевозможные ошибки, поскольку я абсолютный новичок в программировании на Linux, а не на программирование, ОС Linux и C.


Испытания:

gcc -I ./lib/ -c ./lib/error_functions.c и затем gcc -o seek_io.c ./error_function.o выдает ошибку: /usr/lib/gcc/x86_64-linux-gnu/crt1.o: In function _start: (.text+0x20): undefined reference to main collect2: error: ld returned 1 exit status

После этого запуска на ls я обнаружил, что мой seek_io.c не указан в списке.


В основном автор книги говорит для tlpi_hdr.h file:

Этот заголовочный файл включает в себя различные другие заголовочные файлы, используемые многими примерами программ, определяет логический тип данных и определяет макросы для вычисления минимума и максимума двух числовых значений. Использование этого заголовочного файла позволяет нам сделать примеры программ немного короче.


Ссылка на коды для файлов, упомянутых выше:

tlpi_hdr.h

error_functions.h

error_functions.c

get_num.h

get_num.c

seek_io.c

1 Ответ

0 голосов
/ 06 января 2019

Проблема связана с вашей второй командой 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...