简体   繁体   English

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

[英]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运行时,输出应该以binobj目录结束。

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.

相关问题 使用 makefile 链接来自不同目录的 .h 文件和 .c 文件 - Link .h files and .c files from different directory using makefile 在Linux中使用makefile将源文件更新到其他文件夹 - Updating source files to different folder using makefile in Linux Makefile将源文件从不同目录构建到同一对象目录中 - Makefile builds source files from different directories into the same object directory 如何在makefile中使用不在当前目录中的源文件? - how to use source files that are not in current directory in makefile? Makefile:将源文件,头文件,共享库文件编译到输出目录中 - Makefile: compile source, header, shared library files into an output directory 如何使用 Makefile 在一个目录中编译多个单独的 C 文件? - How to compile multiple separate C files in a directory using a Makefile? 在Linux中使用文件时,哪些内核模块负责? - What kernel modules would be responsible when using files in Linux? 使用 C 计算 Linux 中目录和子目录中的文件 - Count Files in directory and subdirectory in Linux using C 如何编写makefile来生成目标文件和可执行文件在不同的目录中? - How to write a makefile to generate object files and executable in different directory? 如何从目录访问多个脱机pcap文件并使用c捕获源IP地址 - how to access multiple offline pcap files from a directory and capture the source ip address using c
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM