多个C文件编译成一个内核模块的问题

时间:2021-11-04 10:02:46
我想将多个.c文件编译成一个.ko,也用到了类似下面的解决办法:
obj-m:=hello.o
hello-objs:=A.o B.o C.o
但是我的每个C文件都包含一个头文件D.h
D.h中定义了一些数据结构,可是make之后的结果说这些数据结构重复定义了,请问如何解决这个问题呢?
谢谢各位

15 个解决方案

#1


用#ifndef XXX   
   #define XXX
   //xxxxxx
   #endif

#2


用了,但是出现这个问题

#3


干脆不用h文件得了 ,在c文件中分别声明用到的数据结构啊。

#4


引用 2 楼 tonywarm 的回复:
用了,但是出现这个问题


没理由呀,请LZ再仔细检查下代码。
注意#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
的位置

#5


引用 4 楼 winscar 的回复:
引用 2 楼 tonywarm 的回复:
用了,但是出现这个问题


没理由呀,请LZ再仔细检查下代码。
注意#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
的位置




定义和声明都没问题,但是我定义并初始化了一个数组,然后就说这个数组是重复定义了

#6


重复定义的话,编译器应该会给出你重复定义的具体位置啊,根据编译器给的信息应该就可以找出来啊

#7


是不是你在你的同文件里面定义变量了,并且变量不是static类型的,楼主你看看

#8


如果楼主的代码不是那么保密的话,可以放上来,或者将里面敏感的名称修改一下,这样有代码比较好办一些。

#9


数组的定义和初始化,不要放在头文件里。放到C文件里,然后在头文件里extern,这样include头文件的C文件也就都可以用了

#10


引用 5 楼 tonywarm 的回复:
定义和声明都没问题,但是我定义并初始化了一个数组,然后就说这个数组是重复定义了


这个是关键,头文件中最好不要定义并初始化一个数组,头文件用extern,而在c文件定义并初始化
在啰唆几句:
1. 头文件中用extern是表示这个变量是在外部定义,此处要用到,但没有分配内存空间
2. 用#ifdefine。。。。。#endif包含头文件是为了防止在同一个源文件中包含某个头文件两次。为什么会出现这种状况呢?难道会有人写#include<XXX.h>两次?可以想想

#11


类型定义不分配内存的,比如类的定义,结构体的定义,它是定义一个数据类型而已
数据定义分配内存,比如类对象定义,变量定义
一个原则:
不分配内存的,放在头文件
分配内存的放在c 或cpp文件

#12


有没有在.c里面,不上心再声明?

#13


先对上面积极回答我问题的各位道个歉,我这几天一直没上网,刚看到,谢谢各位的解答,没及时回复对不起了。

呃,可能我的表达有点不准确,代码不方便贴,出问题的地方我简单写下:
先是extern一些变量,具体的实现实在.c中,然后这些变量的引用我放在了以个数组中

extern A* a1;
extern A* a2;
extern A* a3;

A* table[] = {
&a1,
&a2,
&a3
};

这个头文件被两个.c文件include,然后我编译的时候就说table重复定义,并报错。

#14


当然这段代码是在
#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
中的

#15


在你的D.h文件中,加入
#ifndef __D_H
#define __D_H

.....

#endif

#1


用#ifndef XXX   
   #define XXX
   //xxxxxx
   #endif

#2


用了,但是出现这个问题

#3


干脆不用h文件得了 ,在c文件中分别声明用到的数据结构啊。

#4


引用 2 楼 tonywarm 的回复:
用了,但是出现这个问题


没理由呀,请LZ再仔细检查下代码。
注意#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
的位置

#5


引用 4 楼 winscar 的回复:
引用 2 楼 tonywarm 的回复:
用了,但是出现这个问题


没理由呀,请LZ再仔细检查下代码。
注意#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
的位置




定义和声明都没问题,但是我定义并初始化了一个数组,然后就说这个数组是重复定义了

#6


重复定义的话,编译器应该会给出你重复定义的具体位置啊,根据编译器给的信息应该就可以找出来啊

#7


是不是你在你的同文件里面定义变量了,并且变量不是static类型的,楼主你看看

#8


如果楼主的代码不是那么保密的话,可以放上来,或者将里面敏感的名称修改一下,这样有代码比较好办一些。

#9


数组的定义和初始化,不要放在头文件里。放到C文件里,然后在头文件里extern,这样include头文件的C文件也就都可以用了

#10


引用 5 楼 tonywarm 的回复:
定义和声明都没问题,但是我定义并初始化了一个数组,然后就说这个数组是重复定义了


这个是关键,头文件中最好不要定义并初始化一个数组,头文件用extern,而在c文件定义并初始化
在啰唆几句:
1. 头文件中用extern是表示这个变量是在外部定义,此处要用到,但没有分配内存空间
2. 用#ifdefine。。。。。#endif包含头文件是为了防止在同一个源文件中包含某个头文件两次。为什么会出现这种状况呢?难道会有人写#include<XXX.h>两次?可以想想

#11


类型定义不分配内存的,比如类的定义,结构体的定义,它是定义一个数据类型而已
数据定义分配内存,比如类对象定义,变量定义
一个原则:
不分配内存的,放在头文件
分配内存的放在c 或cpp文件

#12


有没有在.c里面,不上心再声明?

#13


先对上面积极回答我问题的各位道个歉,我这几天一直没上网,刚看到,谢谢各位的解答,没及时回复对不起了。

呃,可能我的表达有点不准确,代码不方便贴,出问题的地方我简单写下:
先是extern一些变量,具体的实现实在.c中,然后这些变量的引用我放在了以个数组中

extern A* a1;
extern A* a2;
extern A* a3;

A* table[] = {
&a1,
&a2,
&a3
};

这个头文件被两个.c文件include,然后我编译的时候就说table重复定义,并报错。

#14


当然这段代码是在
#ifndef XXX   
  #define XXX
  //xxxxxx
  #endif
中的

#15


在你的D.h文件中,加入
#ifndef __D_H
#define __D_H

.....

#endif