【问题标题】:How to add multiple Headers files path in a Makefile?如何在 Makefile 中添加多个 Headers 文件路径?
【发布时间】:2020-01-02 17:28:21
【问题描述】:

我正在尝试编译 uleds.c 驱动程序,该驱动程序包含该路径下存在的多个文件:

/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux

我现在想修改我的 Makefile 并添加这个路径,这样我就可以正确编译 uleds.c

这是我的 Makefile :

#CC=arm-poky-linux-gnueabi-gcc -march=armv7-a -marm -mfpu=neon -mfloat-abi=hard -mcpu=cortex-a5 --sysroot=/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi
#CC="gcc"

obj-m += uleds.o

KERNEL_SOURCE := /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty

default:
        ${CC} ${KERNEL_SOURCE} uleds.c

clean:
        ${CC} $(INC) ${KERNEL_SOURCE} clean

对此有什么建议吗?谢谢

【问题讨论】:

    标签: makefile compilation include include-path kbuild


    【解决方案1】:

    最简单的是:

    ${CC} -I/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux uleds.c
    

    尝试阅读以下内容以熟悉其他 GCC(编译器)选项:https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html#Directory-Options

    【讨论】:

    • KERNEL_SOURCE 不是包含文件的文件夹。这是 Linux 内核的另一条路径,而不是包含 .如我所见,我将在定义路径的位置添加另一个变量,然后添加:-I${variable}
    • 啊,我明白了。更正了我的答案。但是 -I 是答案。
    • 这是一个内核构建文件,这意味着模块应该从内核构建系统构建。 -I 可能会解决 OP 的第一个编译错误,但之后会遇到其他问题。
    【解决方案2】:

    这似乎是对 kbuild 文件的尝试。

    您不应该使用default 规则自己手动编译文件。相反,您应该运行内核的 makefile,并让它根据 obj-m 和朋友编译驱动程序。

    你的 makefile 应该是这样的:

    ifneq ($(KERNELRELEASE),)
    
    ccflags-y += -I some/other/dir
    obj-m += uleds.o
    
    else
    
    # default to build against running kernel if KDIR not
    # specified:
    KDIR ?= /lib/modules/`uname -r`/build
    
    default:
         $(MAKE) -C $(KDIR) M=$$PWD
    
    endif
    

    如果您从驱动程序目录调用 make,它会依次从您的内核目录调用 make,该目录将了解有关内核的所有信息并能够正确构建您的模块。

    请注意,默认情况下,内置内核的 clean 目标将删除所有生成的 *.[oas] 文件,因此不需要特殊的 clean 目标。此外,默认情况下,内核的 makefile 将包含它自己的 include 目录,因此您可能不需要为此做任何特别的事情。如果您确实需要从其他地方包含,您可以将-I 指令添加到ccflags-y,如示例所示。

    详情请参阅Linux Kernel MakefilesBuilding External Modules

    【讨论】:

    • 事实上,我正在 Linux 主机上工作,我正在尝试交叉编译一个驱动程序,该驱动程序将加载到与我的主机不同的另一个 Linux 内核版本中。为此,我使用arm-poky-linux-gnueabi-gcc (GCC) 7.3.0 交叉编译器来构建 uleds.ko 模块。在这个 makefile 中,我定义了我的目标机器 linux 内核的路径以及所有包含现有的
    • 好的,您需要将KDIR 指向内核的源代码树,因此它会为此构建驱动程序。您提到的包含目录看起来是标准包含目录之一,因此它应该在生成的命令行上,但如果不是,您可以随时手动指定它。
    • 我将 Makefile 修改为:ifneq ($(KERNELRELEASE),) ccflags-y += -I /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/usr/src/kernel/include/linux obj-m += uleds.o else # default to build against running kernel if KDIR not # specified: KDIR ?= /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty default: $(MAKE) -C $(KDIR) M=$$PWD endif 比我磁带 make 但这显示了另一个错误
    • make -C /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty M=$ PWD make[1]:进入目录'/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty' make[1] : *** 没有指定目标,也没有找到生成文件。停止。 make[1]: 离开目录'/opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty' Makefile:13: recipe对于目标“默认”失败的制作:*** [默认] 错误 2
    • /opt/poky-atmel/2.5.3/sysroots/cortexa5hf-neon-poky-linux-gnueabi/lib/modules/4.14.73-linux4sam-6.0-dirty 是否有生成文件?内核源目录的根目录应该有一个 Makefile。
    猜你喜欢
    • 2019-02-06
    • 2020-07-03
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多