繁体   English   中英

如何使用`gcc`编译和运行C程序?

[英]How to compile and run a C program with `gcc`?

这里是一个完整的新手。 我正在学习阅读suckless.org上的代码。 它们是用 C 编写的,而且很短,所以我认为这是一个好的开始。

问题是我知道的太少而无法开始。 在网站上闲逛,发现suckless社区有自己的coreutils,也很短。 页面上的echo.c是最短的之一。 我在这里包括它的标题:

/* See LICENSE file for copyright and license details. */
#include <stdio.h>
#include <string.h>
#include "util.h"

我想编译它,看看这个版本的echo是如何工作的,然后回来理解代码。 目标是重复这个过程,直到我足够舒服地阅读他们更大的程序的源代码,比如sentdmenudwm

在代码中,头#include "util.h"建议我把util.h ,这是上面的链接的另一个文件,连同echo.c 我还包括arg.hcompat.h因为头util.h

#include <sys/types.h>

#include <regex.h>
#include <stddef.h>
#include <stdio.h>

#include "arg.h"
#include "compat.h"

我进一步检查了arg.hcompat.h 它们都不包含自定义头文件,所以我认为我很高兴。 现在文件夹树看起来像

$ 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

显然,这些未定义的参数在那些头文件中。 在网上搜索,我进一步尝试

$ gcc -c . echo.c -o echo.o
gcc: warning: .: linker input file unused because linking not done

它会发出警告,但无论如何echo.o传递一个echo.o 我将它chmod为可执行文件,并通过$ ./echo.o运行它,但我的 shell 抱怨

zsh: exec format error: ./echo.o

我又花了一个小时试图解决这个问题……通过尝试和错误,但徒劳无功。 你能指出发生了什么吗? 我该怎么办?

(任何其他建议也将不胜感激。)

您尝试使用您没有的库编译程序。 您使用的标头需要一个动态或静态库(Linux 上的 .a 或 .o)。 这就是为什么linker input file unused because linking not done

zsh: exec format error: ./echo.o如果你使用带有 -o 参数的 .o 扩展名,你要么制作或链接一个 .o 目标文件(静态库)。 使用gcc -c . echo.c -o echo.o gcc -c . echo.c -o echo.o ,您正在创建一个无法执行的静态库(称为对象)。

顺便说一句,我暂时远离这种代码,它对学习者来说非常不友好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM