[英]How to place C compilation output files (Linux kernel modules) in a different directory from the source files's (using Makefile)
I have looked at these and at these other solutions but cannot write the correct Makefile to produce my wanted result. 我已经查看了这些以及其他解决方案,但无法编写正确的Makefile来生成我想要的结果。
So, I have this simple.c
file. 所以,我有这个
simple.c
文件。 It simulates linux kernel module loading and removing. 它模拟linux内核模块的加载和删除。 Location:
/path/to/dir/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");
I also have this Makefile
in the same directory as simple.c
, location: /path/to/dir/Makefile
. 我也将这个
Makefile
放在与simple.c
相同的目录中,location: /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
When on a terminal I run: 在我运行的终端上时:
cd path/to/dir/
make
everything is compiled correctly (in the same directory path/to/dir/
. 一切都正确编译(在
path/to/dir/
相同的目录path/to/dir/
。
What I want is this: 我想要的是这个:
Location of simple.c
in /path/to/dir/src/
. simple.c
在/path/to/dir/src/
。
Location of Makefile
in /path/to/dir/
. Makefile
在/path/to/dir/
。
Location of the outputs in /path/to/dir/bin/
or/and /path/to/dir/obj/
. /path/to/dir/bin/
或/和/path/to/dir/obj/
。
When make
is run, the outputs should end in the bin
, obj
directories. 当
make
运行时,输出应该以bin
, obj
目录结束。
There are some complications in the Makefile ( /lib/modules/$(shell uname -r)/build
) which I don't quite understand. Makefile(
/lib/modules/$(shell uname -r)/build
)中有一些复杂的东西,我不太明白。 All the various changes to the Makefile
in order to reach the desired result, ended without success in errors. 对
Makefile
进行的所有各种更改以达到所需的结果,但在错误中未成功结束。
How do I do it? 我该怎么做?
Edit: 编辑:
The Makefile
in /lib/modules/$(shell uname -r)/build
has the following code: /lib/modules/$(shell uname -r)/build
中的Makefile
具有以下代码:
VERSION = 4
PATCHLEVEL = 4
SUBLEVEL = 162
EXTRAVERSION =
NAME = Blurry Fish Butt
# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
# More info can be located in ./README
# Comments in this file are targeted only to the developer, do not
# expect to learn how to build the kernel reading this file.
# o Do not use make's built-in rules and variables
# (this increases performance and avoids hard-to-debug behaviour);
# o Look for make include files relative to root of kernel src
MAKEFLAGS += -rR --include-dir=$(CURDIR)
# Avoid funny character set dependencies
unexport LC_ALL
LC_COLLATE=C
LC_NUMERIC=C
export LC_COLLATE LC_NUMERIC
# Avoid interference with shell env settings
unexport GREP_OPTIONS
# We are using a recursive build, so we need to do a little thinking
# to get the ordering right.
#
# Most importantly: sub-Makefiles should only ever modify files in
# their own directory. If in some directory we have a dependency on
# a file in another dir (which doesn't happen often, but it's often
# unavoidable when linking the built-in.o targets which finally
# turn into vmlinux), we will call a sub make in that other dir, and
# after that we are sure that everything which is in that other dir
# is now up to date.
#
# The only cases where we need to modify files which have global
# effects are thus separated out and done before the recursive
# descending is started. They are now explicitly listed as the
# prepare rule.
# Beautify output
# ---------------------------------------------------------------------------
#
# Normally, we echo the whole command before executing it. By making
"/lib/modules/4.4.0-141-generic/build/Makefile" [readonly] 1650L, 57062C
I don't know if i have understood the question. 我不知道我是否理解了这个问题。 First of all I recommend you to locate the source code in the SRC folder.
首先,我建议您在SRC文件夹中找到源代码。 After that, choose the dir where you want to create the Makefile.
之后,选择要在其中创建Makefile的目录。
The next step is to define the set of codes that you are going to need to link your program. 下一步是定义链接程序所需的代码集。 Do not forget the path to the SRC folder.
不要忘记SRC文件夹的路径。
Now it's time to create the object files. 现在是时候创建目标文件了。 In this step, choose the option -o [path_obj]/[file_name].o.
在此步骤中,选择-o [path_obj] / [file_name] .o选项。
The last step consist in to link the program, do not forget that the objects are in the [path_obj] folder. 最后一步是链接程序,不要忘记对象在[path_obj]文件夹中。
A simple example could be: 一个简单的例子可能是:
#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]
I hope you find it useful 希望对你有帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.