我正在做我的考试作业。大约还有 6 个小时就到了。突然我的程序无法再编译并出现以下错误消息:
gcc -g -D 调试 -c -o obj/stringops.o src/stringops.c
gcc -g -D 调试 -c -o obj/arrayops.o src/arrayops.c
gcc -g -D 调试 -c -o obj/fileops.o src/fileops.c
gcc -g -D 调试 -c -o obj/builtins.o src/builtins/*.c
gcc -g -D 调试 -c -o obj/tomashell.o src/tomashell.c
gcc -g -D 调试 -o bin/tomashell \
obj/stringops.o obj/arrayops.o obj/fileops.o obj/builtins.o \
obj/tomashell.o
obj/tomashell.o:在函数“n_processes”中:
/root/sc/tomashell/src/safefork.c:11:“h_meta”的多个定义
obj/builtins.o:/root/sc/tomashell/src/builtins/history.c:4:首先在这里定义
obj/tomashell.o:在函数“n_processes”中:
/root/sc/tomashell/src/safefork.c:11:“h_meta_len”的多个定义
obj/builtins.o:/root/sc/tomashell/src/builtins/history.c:4:首先在这里定义
Collect2: ld 返回 1 退出状态
make: *** [bin/tomashell] 错误 1
在这个文件中:
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/errno.h>
extern int errno;
#define MAX_PROCESSES 6
static int n_processes(void)
{ // <- THIS IS LINE 11
return system("exit `ps | wc -l`")/256;
}
pid_t safefork(void)
{
static int n_initial = -1;
if (n_initial == -1)
n_initial = n_processes();
else if (n_processes() >= n_initial+MAX_PROCESSES) {
sleep(2);
errno = EAGAIN; return (pid_t)-1;
}
return fork();
}
Run Code Online (Sandbox Code Playgroud)
有人请帮助我或杀了我。我不想生活在一个可能出现这种错误的世界里。
对可能出什么问题有什么想法吗?
正如我在评论中提到的,问题在于h_metaand的多个定义h_meta_len- 是因为它们是在包含在多个翻译单元中的 .h 文件中定义的,还是由于 .c (具有变量(直接或在包含的 .h)中包含在另一个 .c 中。包含防护可以使您避免编译错误,但不能避免链接错误。
这给我带来了奇怪的错误消息: You get those at link time。链接器对目标文件进行操作,其中包含 .c 文件中的代码及其包含的所有文件。因此,假设h_meta和friend 没有直接在两个.c 文件中定义,则链接器只能做这么多来为您提供有用的信息。在 VC 中,您只会收到一条消息,告诉您有多个定义和目标文件列表(而不是 .c)。
因此,鉴于定义来自上述 .c 文件中包含的文件,因此定义没有实际的行号。我猜 GCC 只是默认到源代码的开头。