【发布时间】:2020-02-23 08:30:24
【问题描述】:
我在 kthread.h 中定义了一个宏,如下所示。
#define KERNEL_THREAD_SAVED_KERENL_TOP_OFFSET 208
我正在尝试在 syscall.cc 中使用该宏
#include "syscall.h"
#include "kthread.h"
#define SET_KERNEL_THREAD_TOP_OFFSET(offset, reg) \
"movq " #offset "(%%" #reg "), %%rsp \n"
// .. and in some function
void func() {
asm volatile(
SET_KERNEL_THREAD_TOP_OFFSET(KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET, rbx)
:::);
}
如果我编译它,它会给出以下链接器错误。
syscall.cc:41: undefined reference to `KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET'
好的,我明白了。那么可能链接器没有找到宏?所以我也尝试在 .cc 中用一些不同的值来定义它。
#include "syscall.h"
#include "kthread.h"
#define KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET 100
#define SET_KERNEL_THREAD_TOP_OFFSET(offset, reg) \
"movq " #offset "(%%" #reg "), %%rsp \n"
然后,我得到一个编译器错误
./kernel/syscall.cc:5: error: "KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET" redefined [-Werror]
5 | #define KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET 100
|
In file included from ./kernel/syscall.cc:3:
./kernel/kthread.h:7: note: this is the location of the previous definition
7 | #define KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET 208
|
很明显,编译器知道 syscall.cc 中的 KERNEL_THREAD_SAVED_KERNEL_TOP_OFFSET。那为什么链接器看不到定义呢??
【问题讨论】:
-
#define KERNEL_THREAD_SAVED_KERENL_TOP_OFFSET 208... KERENL??? -
KERNEL_THREAD_SAVED_KERENL_TOP_OFFSET中是否有相关的错字,即第二个 KERNEL 不应该是 KERENL? -
啊,这是我从我的代码复制到这里时犯的错字。无论如何,发布的答案解决了问题:p
标签: c++ c macros linker c-preprocessor