首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核链接

Linux内核链接
EN

Stack Overflow用户
提问于 2015-03-25 20:13:30
回答 1查看 769关注 0票数 0

因此,正如我在here中提到的,我正在对Linux进行一些更改。

现在,更改非常小,但是为了隔离它们,我希望我的东西在它自己的文件中。

我的更改基本上重新定义了一些函数,因此它们依赖于父文件中的函数。

因此,foo.c包含:

代码语言:javascript
复制
/* headers.h does not contain a prototype my_fun2*/
#include "headers.h"
static void fun1(){
  ...
}

void fun2(){
 ...
 fun1()
}

my_foo.c包含:

代码语言:javascript
复制
/* 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,使其具有以下内容

代码语言:javascript
复制
obj-$(CONFIG_MY_FOO) +=foo.o my_foo.o

然而,所有这些加在一起,似乎不起作用。我以前使用过make文件,通常情况下,配方如下:

代码语言:javascript
复制
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时,会得到以下错误:

代码语言:javascript
复制
my_foo.c:XX: undefined reference to `fun1()'

我遗漏了什么?我是否只需要将函数复制到my_foo.c,因为fun1()是静态的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-25 20:38:55

在C中,全局函数默认具有外部链接,这意味着只要包含一个原型,就可以从其他编译单元(C源文件)中使用它们。

但是,如果函数被声明为static,那么它就改变为内部链接,即它只能从同一个编译单元中使用。

实际上,静态函数不会发出链接器使用的符号,而非静态函数则会发出这样的函数。

在头文件中将小的实用程序函数编写为静态函数是一种有点标准的做法,也可以选择标记为inline

如果函数不是很小,我的建议是将其设置为外部(非静态)。注意,在Linux内核中,为了能够从其他模块中使用您的函数,您需要使用一些特定的宏(不要混合“内核模块”和“编译单元”)导出符号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29265630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档