Как скомпилировать и запустить C программу с `gcc`? - PullRequest
0 голосов
/ 17 марта 2020

Полный новичок 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

Я потратил еще час, пытаясь решить эту проблему ... методом проб и ошибок, но тщетно. Не могли бы вы указать, что происходит? А что мне делать?

(Любые другие предложения также будут очень благодарны.)

1 Ответ

2 голосов
/ 14 апреля 2020

Вы пытаетесь скомпилировать программу с библиотекой, которой у вас нет. Заголовок, который вы используете, нуждается в динамической библиотеке c или stati c (.a или .o для linux). Вот почему вы получаете linker input file unused because linking not done.

zsh: exec format error: ./echo.o, если вы используете расширение .o с аргументом -o, вы создаете или связываете объектный файл .o (stati c lib). С gcc -c . echo.c -o echo.o вы создаете стати c библиотеку (называемую объектом), которую вы не сможете выполнить.

Кстати, я бы пока держался подальше от такого рода код, это очень не дружелюбный пользователь для ученика.

...