gpt4 book ai didi

c - header 中的 EXPORT_SYMBOL 导致 "exported twice"错误

转载 作者:太空狗 更新时间:2023-10-29 12:05:14 25 4
gpt4 key购买 nike

我有一个头文件,其中声明了几个全局变量,格式如下:

constants.h

#ifndef CONSTANTS_H
#define CONSTANTS_H

extern unsigned var;
EXPORT_SYMBOL(var);

#endif

常量.c

#include "constants.h"
unsigned var = 10;

foo.c

#include "constants.h"

当我尝试编译内核模块时,对于每个相应的导出符号,我都会收到以下错误:

WARNING: /home/vilhelm/proj/constants: 'var' exported twice. Previous export was in /home/vilhelm/proj/foo.ko

我怀疑每次包含 constants.h 头文件时都会导出符号,但我不明白为什么。 constants.h 中的 include guard 不应该防止 EXPORT_SYMBOL(var) 被多次读取吗?

最佳答案

Shouldn't the include guard in constants.h prevent the EXPORT_SYMBOL(var) from being read multiple times?

include guard 防止 header 在相同 源文件中被多次包含。它无法阻止通过多个 源文件包含它。请记住,来自所有源的对象都链接到一个对象中,因此会发生冲突。

假设您有另一个头文件也包含在源文件中,称为 foo.h,它又包含 constants.h。文件 constants.c 将尝试包含 constants.h 两次(一次直接通过 constants.h,另一次通过 foo.h)。 include 守卫在这里起作用,并且 constants.h 只会被包含一次。

foo.c 也会发生同样的事情。它将尝试包含 constants.h 两次(一次直接通过 constants.h,另一次通过 foo.h)。 include 守卫在这里也起作用,并且 constants.h 只会被包含一次。

但是这两个对象,constants.o 和 foo.o 将链接在一起,每个对象都通过 constants.h 导出其单个副本。这加起来是两个。

您希望确保导出在最终链接中只出现一次。一种方法是将它们从 constants.h 等通用文件中取出,并将它们移动到名为 exports.c 的文件中。

关于c - header 中的 EXPORT_SYMBOL 导致 "exported twice"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15889194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com