Я скомпилировал эту программу с помощью gcc -c
, а затем связал ее с ld -lrt
Пока вы не стали более опытными, вы не должны пытаться вызывать ld
напрямую.Вместо этого, связывайте свои программы, а также компилируйте их, используя команду gcc
(или cc
).Для вашего случая использования должна работать командная строка:
gcc -o myprogram myprogram.o -lrt
.(Обратите внимание на размещение -lrt
; в большинстве случаев -l
опции должны идти после объектных файлов в командной строке, по утомительным историческим причинам.)
Под капотомКогда вы связываете программу с помощью команды gcc
, она запускает для вас ld
, но включает в себя целый набор дополнительных аргументов.Все это необходимо для создания обычных программ, и они достаточно сложны, чтобы обычные программисты не должны были о них беспокоиться.Одним из дополнительных аргументов является -lc
, указывающее ld
включить ядро библиотеки времени выполнения C, которая предоставляет определение waitpid@@GLIBC_2.2.5
, которое отсутствовало в вашей ссылке.(Не пытайтесь просто вставить -lc
в командную строку ld
самостоятельно. Собственно, попробуйте это. Вы обнаружите, что получаете только еще более загадочное сообщение об ошибке, вероятно, что-то вроде warning: cannot find entry symbol _start
или undefined reference to __bswapsi2
или кто даже знает.)
Вы можете увидеть, что это за дополнительные аргументы, если вам интересно, добавив -v
к приведенному выше вызову gcc
, но это большой беспорядок и единственный компиляторразработчикам нужно беспокоиться о большинстве из них.
Почему именно команда gcc
, а не команда ld
, знает все эти дополнительные аргументы, которые вам необходимы для правильной связи нормальной программы?Это в основном историческое, но идея в том, что ld
минимален, поэтому, если вы делаете что-то необычное (например, связываете ядро операционной системы), вам не нужно выключать что-либо обычное , отключая , вы простонужно начинать с нуля и наращивать.Но для обычных программ люди могут использовать (g)cc
и не должны беспокоиться о дополнительных аргументах.
Кстати, материал, который вы нашли в руководстве по поводу _XOPEN_SOURCE
, не о том, как сделать wait
доступно во время ссылки;речь идет о том, как сделать объявление из wait
доступным в время компиляции .Кроме того, значение, которое вы определяете _XOPEN_SOURCE
имеет значение.Определив его как -D_XOPEN_SOURCE
вместо -D_XOPEN_SOURCE=500
, вы получили жалобу на неявное объявление ftruncate
.