如何将C编译输出文件(Linux内核模块)放置在与源文件不同的目录中(使用Makefile)

时间:2019-05-21 14:55:18

标签: c linux makefile compilation

我看过thesethese other solutions,但是无法编写正确的Makefile来产生所需的结果。

因此,我有这个< HTTP/1.1 301 Moved Permanently < Content-Type: text/html; charset=utf-8 < Function-Execution-Id: t8frc9wsdvzp < Location: $redirectURL < X-Cloud-Trace-Context: 1f817eecdc84ad4a7542fba5898caf50;o=1 < Date: Mon, 20 May 2019 13:02:37 GMT < Server: Google Frontend < Content-Length: 319 < Alt-Svc: quic=":443"; ma=2592000; v="46,44,43,39" 文件。它模拟linux内核模块的加载和删除。位置:simple.c

/path/to/dir/simple.c

我也将此#include <linux/init.h> #include <linux/module.h> #include <linux/kernel.h> /* This function is called when the module is loaded. */ int simple_init(void) { printk(KERN_INFO "Loading Module\n"); return 0; } /* This function is called when the module is removed. */ void simple_exit(void) { printk(KERN_INFO "Removing Module\n"); } /* Macros for registering module entry and exit points. */ module_init( simple_init ); module_exit( simple_exit ); MODULE_LICENSE("GPL"); MODULE_DESCRIPTION("Simple Module"); MODULE_AUTHOR("SGG"); Makefile放在同一目录中,位置:simple.c

/path/to/dir/Makefile

在终端上运行时:

obj-m += simple.o
all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

所有内容均已正确编译(在同一目录cd path/to/dir/ make 中。

我想要的是这个

path/to/dir/simple.c中的位置。

/path/to/dir/src/Makefile中的位置。

输出在/path/to/dir/或/和/path/to/dir/bin/中的位置。

运行/path/to/dir/obj/时,输出应在makebin目录中结束。

我不太了解Makefile(obj)中的一些复杂情况。为了获得所需结果,对/lib/modules/$(shell uname -r)/build的所有各种更改都以失败告终。

我该怎么做?

编辑:

Makefile中的Makefile具有以下代码:

/lib/modules/$(shell uname -r)/build

1 个答案:

答案 0 :(得分:0)

我不知道我是否理解这个问题。首先,我建议您在SRC文件夹中找到源代码。之后,选择要在其中创建Makefile的目录。

下一步是定义链接程序所需的代码集。不要忘记SRC文件夹的路径。

现在是时候创建目标文件了。在此步骤中,选择选项-o [path_obj] / [file_name] .o。

最后一步是链接程序,不要忘记对象位于[path_obj]文件夹中。

一个简单的例子可能是:

#path definitions

SRC_path = /path_to_src/
OBJ_path = /path_to_obj/
BIN_path = /path_to_bin/

#lists definitions
SRC = [file1].c [file2].c
OBJ = $(addsuffix .o, $(basename ${SRC}))

#Suffixes definitions
.suffixes:
.suffixes: .c .o

#Create objects
.c.o:   gcc -I[include_files] -c $(SRC_path)$< -o $(OBJ_path)$@

#Link program
TAG:    gcc  $(addprefix $(OBJ_path), $(OBJ)) -o $(BIN_path)[program_name]

我希望您觉得它有用