ld:const变量的多重定义

问题描述 投票:0回答:1

我正在使用 JHU 版本的 PintOS 来完成 PintOS 项目。但是当我在

make
(在我的本地计算机上是
src/userprog
)下
~/Documents/PintOS/userprog/
时,它会向我抛出此错误:

cd build && make all 
make[1]: Entering directory '/home/pairman/Documents/PintOS/userprog/build'
gcc -Wl,--build-id=none -nostdlib -static -Wl,-T,../../lib/user/user.lds tests/userprog/multi-recurse.o tests/lib.o lib/user/entry.o libc.a -o tests/userprog/multi-recurse
/usr/bin/ld: tests/lib.o:/home/pairman/Documents/PintOS/userprog/build/../../tests/lib.c:8: multiple definition of `test_name'; tests/userprog/multi-recurse.o:/home/pairman/Documents/PintOS/userprog/build/../../tests/userprog/multi-recurse.c:10: first defined here
collect2: error: ld returned 1 exit status
make[1]: *** [../../Makefile.userprog:39: tests/userprog/multi-recurse] 
Error 1 
make[1]: Leaving directory '/home/pairman/Documents/PintOS/userprog/build'
make: *** [../Makefile.kernel:10: all] Error 2

部分相关代码:

测试/lib.c:

#include "tests/lib.h"
#include <random.h>
...
#include <syscall.h>

const char *test_name;

...

测试/lib.c:

#ifndef TESTS_LIB_H
#define TESTS_LIB_H

#include <debug.h>
...
#include <syscall.h>

extern const char *test_name;

...

#endif /* test/lib.h */

测试/userprog/multi-recurse.c:

#include <debug.h>
...
#include <syscall.h>
#include "tests/lib.h"

const char *test_name = "multi-recurse";

...

我的系统是Fedora 39,我使用的是通过dnf安装的工具链,而不是自编译的。上面的代码来自原始存储库。我不知道是什么破坏了我机器上的代码。在我的机器上,

threads
下make可以通过,但是
userprog
有这个问题,而在我的校园实验室环境下编译相同的代码没有问题。

我尝试用

tests/lib.c
#ifndef
来修复
#define
中的声明,但这会导致
no type
中出现
tests/userprog/multi-recurse.c
错误,所以我所做的可能是错误的。

有什么办法可以修复这个make错误吗?

c makefile ld pintos
1个回答
0
投票

tests/lib.c
中,将
const char *test_name;
更改为
extern const char *test_name;

const char *test_name;
是一个 暂定定义,尽管它的名字如此,它本身并不是定义,但可能会导致定义的生成。

一些工具,包括 GCC 版本 10 之前的 GCC 版本和相关工具,将暂定定义产生的多个定义视为“通用”定义,并将它们合并为一个定义(如果存在,则连同一个常规定义)。您的工具将暂定定义中的定义视为常规定义。

您可以通过将

-fcommon
添加到 GCC 命令来请求旧行为。

© www.soinside.com 2019 - 2024. All rights reserved.