Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从多个文件编译内核模块时未编译主文件_C_Build_Linux Kernel_Kernel Module_Kbuild - Fatal编程技术网

C 从多个文件编译内核模块时未编译主文件

C 从多个文件编译内核模块时未编译主文件,c,build,linux-kernel,kernel-module,kbuild,C,Build,Linux Kernel,Kernel Module,Kbuild,首先,我想说,我一直在寻找类似的问题,解决方案是什么。我发现它是: obj-m := module.o module-objs := extra.o 但这对我不起作用 以下是整个项目的来源: 轴_控制器.h: #ifndef _AXIS_CONTROLLER_H #define _AXIS_CONTROLLER_H #include <linux/kernel.h> #include <linux/module.h> #include <linux/hrtime

首先,我想说,我一直在寻找类似的问题,解决方案是什么。我发现它是:

obj-m := module.o
module-objs := extra.o
但这对我不起作用

以下是整个项目的来源:

轴_控制器.h:

#ifndef _AXIS_CONTROLLER_H
#define _AXIS_CONTROLLER_H

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/hrtimer.h>
#include <linux/ktime.h>

struct axis_controller {
    struct hrtimer timer;
    int state;
};

static inline struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller);

static inline void axis_controller_reset_state(struct axis_controller* axis_controller);

inline void axis_controller_init(struct axis_controller* axis_controller, enum hrtimer_restart (*function)(struct hrtimer *));

inline int axis_controller_clean(struct axis_controller* axis_controller);

inline void axis_controller_change_state(struct axis_controller* axis_controller, unsigned long sec, unsigned long nano_sec);

inline void axis_controller_controll(struct axis_controller* axis_controller);

#endif
CNC_控制器.c:

#include "axis_controller.h"

MODULE_LICENSE("GPL v2");

struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller) {
    return &(axis_controller->timer);
}

void axis_controller_reset_state(struct axis_controller* axis_controller) {
    axis_controller->state = 0;
}

void axis_controller_init(struct axis_controller* axis_controller, enum hrtimer_restart (*function)(struct hrtimer *)) {
    hrtimer_init(axis_controller_get_timer(axis_controller), CLOCK_MONOTONIC, HRTIMER_MODE_REL);
    axis_controller->timer.function = function;
    axis_controller_reset_state(axis_controller);
}

int axis_controller_clean(struct axis_controller* axis_controller) {
    return hrtimer_try_to_cancel(axis_controller_get_timer(axis_controller));
}
void axis_controller_change_state(struct axis_controller* axis_controller, unsigned long sec, unsigned long nano_sec) {
    axis_controller->state = !axis_controller->state;
    hrtimer_start(axis_controller_get_timer(axis_controller), ktime_set(sec, nano_sec), HRTIMER_MODE_REL);
}
void axis_controller_controll(struct axis_controller* axis_controller) {
    axis_controller_reset_state(axis_controller);
    axis_controller->timer.function(axis_controller_get_timer(axis_controller));
}

//printk(KERN_INFO "axis_controller.c\n");
#include <linux/kernel.h>
#include <linux/module.h>
#include "axis_controller/axis_controller.h"

MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Ivo Stratev (NoHomey)");
MODULE_DESCRIPTION("CNC Controller");

printk(KERN_INFO "CNC_controller.c\n");

static int return_value;
static struct axis_controller test;

static enum hrtimer_restart my_callback(struct hrtimer *timer) {
  printk(KERN_INFO "my_hrtimer_callback called\n");
  return HRTIMER_NORESTART;
}

static int __init on_load(void) {
  printk("on_load\n");
  axis_controller_init(&test, my_callback);

  axis_controller_controll(&test);

  return 0;
}

static void on_unload(void) {
  printk("on_unload\n");
  axis_controller_clean(&test);
  return;
}

module_init(on_load);
module_exit(on_unload);
这是构建过程:

ivo@ivo-Inspiron-5558:~/CNC-Controller$ make
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller clean
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic'
CLEAN   /home/ivo/CNC-Controller/.tmp_versions
CLEAN   /home/ivo/CNC-Controller/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic'
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic'
CC [M]  /home/ivo/CNC-Controller/axis_controller/axis_controller.o
LD [M]  /home/ivo/CNC-Controller/CNC_controller.o
Building modules, stage 2.
MODPOST 1 modules
CC      /home/ivo/CNC-Controller/CNC_controller.mod.o
LD [M]  /home/ivo/CNC-Controller/CNC_controller.ko
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic'
ivo@ivo-Inspiron-5558:~/CNC-Controller$ 
当我拆下线路时

CNC_controller-objs := axis_controller/axis_controller.o
建造过程是:

ivo@ivo-Inspiron-5558:~/CNC-Controller$ make
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller clean
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic'
CLEAN   /home/ivo/CNC-Controller/.tmp_versions
CLEAN   /home/ivo/CNC-Controller/Module.symvers
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic'
make -C /lib/modules/4.4.0-28-generic/build M=/home/ivo/CNC-Controller modules
make[1]: Entering directory '/usr/src/linux-headers-4.4.0-28-generic'
CC [M]  /home/ivo/CNC-Controller/CNC_controller.o
In file included from include/linux/printk.h:6:0,
                from include/linux/kernel.h:13,
                from /home/ivo/CNC-Controller/CNC_controller.c:2:
include/linux/kern_levels.h:4:18: error: expected declaration specifiers or ‘...’ before string constant
#define KERN_SOH "\001"  /* ASCII Start Of Header */
                ^
include/linux/kern_levels.h:13:19: note: in expansion of macro ‘KERN_SOH’
#define KERN_INFO KERN_SOH "6" /* informational */
                ^
/home/ivo/CNC-Controller/CNC_controller.c:10:8: note: in expansion of macro ‘KERN_INFO’
printk(KERN_INFO "CNC_controller.c\n");
        ^
In file included from /home/ivo/CNC-Controller/CNC_controller.c:4:0:
/home/ivo/CNC-Controller/axis_controller/axis_controller.h:14:31: warning: ‘axis_controller_get_timer’ declared ‘static’ but never defined [-Wunused-function]
static inline struct hrtimer* axis_controller_get_timer(struct axis_controller* axis_controller);
                            ^
/home/ivo/CNC-Controller/axis_controller/axis_controller.h:16:20: warning: ‘axis_controller_reset_state’ declared ‘static’ but never defined [-Wunused-function]
static inline void axis_controller_reset_state(struct axis_controller* axis_controller);
                    ^
scripts/Makefile.build:264: recipe for target '/home/ivo/CNC-Controller/CNC_controller.o' failed
make[2]: *** [/home/ivo/CNC-Controller/CNC_controller.o] Error 1
Makefile:1403: recipe for target '_module_/home/ivo/CNC-Controller' failed
make[1]: *** [_module_/home/ivo/CNC-Controller] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.4.0-28-generic'
Makefile:10: recipe for target 'all' failed
make: *** [all] Error 2
ivo@ivo-Inspiron-5558:~/CNC-Controller$ 
这就是为什么我认为它没有编译,因为它记录了printk错误:

include/linux/kern_levels.h:4:18: error: expected declaration specifiers or ‘...’ before string constant
    #define KERN_SOH "\001"  /* ASCII Start Of Header *

知道我做错了什么吗?因为我做了我看到其他人在做的事

根据错误消息,您在顶层调用函数。这表明在main或其他函数之外有一个调用

更精确地说,
printk(KERN_INFO“CNC_controller.c\n”)


在旁注
#define KERN_SOH“\001”
只能用作止动符,因为
'\0'
是终止字符。如果这是您想要的,我留给您说。

根据错误消息,您在顶层调用函数。这表明在main或其他函数之外有一个调用

更精确地说,
printk(KERN_INFO“CNC_controller.c\n”)

在旁注
#define KERN_SOH“\001”
只能用作止动符,因为
'\0'
是终止字符。如果这是你想要的,我留给你说。

你有两个问题:

  • 不能从全局范围使用printk。必须将其移动到函数
  • 在尝试构建多文件模块时,不能使用与模块同名的C文件。也就是说,重命名CNC_controller.c或.ko 例如,重命名
    CNC\u controller.c
    CNC\u controller\u main.c
    并使用:

    CNC_控制器-objs:=CNC_控制器_main.c轴_控制器/轴_控制器.o

    • 您有两个问题:

      • 不能从全局范围使用printk。必须将其移动到函数
      • 在尝试构建多文件模块时,不能使用与模块同名的C文件。也就是说,重命名CNC_controller.c或.ko 例如,重命名
        CNC\u controller.c
        CNC\u controller\u main.c
        并使用:

        CNC_控制器-objs:=CNC_控制器_main.c轴_控制器/轴_控制器.o


      不,我添加了printk,因为它在堆栈外调用时只会生成错误,所以我可以证明CNC_controller.c是第二次编译的,但首先要注意(当存在依赖关系时,第一次链接时…)不,我已经添加了printk,因为它在堆栈外调用时只会生成错误,所以我可以证明CNC_controller.c是第二次编译的,但首先要注意(当存在依赖关系时,它第一次被链接…)
      include/linux/kern_levels.h:4:18: error: expected declaration specifiers or ‘...’ before string constant
          #define KERN_SOH "\001"  /* ASCII Start Of Header *