我正在使用 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错误吗?
在
tests/lib.c
中,将 const char *test_name;
更改为 extern const char *test_name;
。
const char *test_name;
是一个 暂定定义,尽管它的名字如此,它本身并不是定义,但可能会导致定义的生成。
一些工具,包括 GCC 版本 10 之前的 GCC 版本和相关工具,将暂定定义产生的多个定义视为“通用”定义,并将它们合并为一个定义(如果存在,则连同一个常规定义)。您的工具将暂定定义中的定义视为常规定义。
您可以通过将
-fcommon
添加到 GCC 命令来请求旧行为。