Полный новичок ie здесь. Я учусь читать коды на suckless.org . Они написаны на C, и в большинстве своем они довольно короткие, поэтому я думаю, что это хорошее начало.
Проблема в том, что я слишком мало знаю для начала. Бродя по сайту, я обнаружил, что у сообщества бездетных есть свои coreutils, которые тоже очень короткие. echo.c
на этой странице является одним из самых коротких. Я включаю его заголовок здесь:
/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include "util.h"
Я хотел бы скомпилировать его и посмотреть, как работает эта версия echo
, и вернуться, чтобы понять код. Цель состоит в том, чтобы повторять этот процесс, пока я не почувствую себя достаточно комфортно, чтобы прочитать исходные коды их более крупных программ, таких как sent
, dmenu
, dwm
.
В коде заголовок #include "util.h"
предлагает мне поставить util.h
, который является другим файлом в ссылке выше, вместе с echo.c
. Я также включаю arg.h
и compat.h
, потому что заголовок util.h
говорит
#include <sys/types.h>
#include <regex.h>
#include <stddef.h>
#include <stdio.h>
#include "arg.h"
#include "compat.h"
Я дополнительно проверил arg.h
и compat.h
. Ни один из них не включает настраиваемые заголовочные файлы, так что я думаю, что я хорош для go. Теперь дерево папок выглядит как
$ tree
.
├── arg.h
├── compat.h
├── echo.c
└── util.h
, и я запускаю $ gcc echo.c -o echo.o
. Тем не менее, я получил ошибку
/usr/bin/ld: /tmp/cc2VjXNO.o: in function `main':
echo.c:(.text+0x20): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x27): undefined reference to `argv0'
/usr/bin/ld: echo.c:(.text+0x8d): undefined reference to `putword'
/usr/bin/ld: echo.c:(.text+0xc8): undefined reference to `fshut'
collect2: error: ld returned 1 exit status
Видимо, эти неопределенные аргументы находятся в этих заголовочных файлах. Осматривая net, я попытался
$ gcc -c . echo.c -o echo.o
gcc: warning: .: linker input file unused because linking not done
. Выдает предупреждение, но в любом случае echo.o
доставляется. Я chmod
это исполняемый файл, и запустить его на $ ./echo.o
, но моя оболочка жалуется
zsh: exec format error: ./echo.o
Я потратил еще час, пытаясь решить эту проблему ... методом проб и ошибок, но тщетно. Не могли бы вы указать, что происходит? А что мне делать?
(Любые другие предложения также будут очень благодарны.)