因此,正如我在here中提到的,我正在对Linux进行一些更改。
现在,更改非常小,但是为了隔离它们,我希望我的东西在它自己的文件中。
我的更改基本上重新定义了一些函数,因此它们依赖于父文件中的函数。
因此,foo.c包含:
/* headers.h does not contain a prototype my_fun2*/
#include "headers.h"
static void fun1(){
...
}
void fun2(){
...
fun1()
}my_foo.c包含:
/* headers.h does not contain a prototype my_fun2*/
#include "headers.h"
/* Note: I'm not #include "foo.c" */
extern void fun1();
void my_fun2()
{
...
fun1()
}您将注意到,在my_foo.c中,我使用的是extern void fun1(),而不是extern static void fun1(),因为这显然会导致存储类的冲突。对此作进一步的解释会很好。
现在我已经按照我想要的方式编写了我的代码,我将编辑相应的Makefile,使其具有以下内容
obj-$(CONFIG_MY_FOO) +=foo.o my_foo.o然而,所有这些加在一起,似乎不起作用。我以前使用过make文件,通常情况下,配方如下:
foo: foo.o bar.o
$(cc) foo.o bar.o -o foo
foo.o: foo.c
$(cc) -c foo.c
bar.o: bar.c
$(cc) -c bar.c但是,这似乎不是Linux内核Makefiles中的格式。因此,当我运行make时,会得到以下错误:
my_foo.c:XX: undefined reference to `fun1()'我遗漏了什么?我是否只需要将函数复制到my_foo.c,因为fun1()是静态的?
发布于 2015-03-25 20:38:55
在C中,全局函数默认具有外部链接,这意味着只要包含一个原型,就可以从其他编译单元(C源文件)中使用它们。
但是,如果函数被声明为static,那么它就改变为内部链接,即它只能从同一个编译单元中使用。
实际上,静态函数不会发出链接器使用的符号,而非静态函数则会发出这样的函数。
在头文件中将小的实用程序函数编写为静态函数是一种有点标准的做法,也可以选择标记为inline。
如果函数不是很小,我的建议是将其设置为外部(非静态)。注意,在Linux内核中,为了能够从其他模块中使用您的函数,您需要使用一些特定的宏(不要混合“内核模块”和“编译单元”)导出符号。
https://stackoverflow.com/questions/29265630
复制相似问题