• Uncategorized

About c : linux-header-include-fails-in-C-program

Question Detail

i am an embedded developer and quite new to the Linux world.
my task is to write a fairly simple driver which i am to understand the need for linux-kernel modules .

i do have a simple c file which iam trying to compile but with no success yet

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/ioport.h>

void main (void)
    printf("Hi There ! \n");

i get the error init.h and ioport.h files are not found

the compatible version of linux-header is now installed on my pc using apt pm.

these files are not in usr/include/linux but they are stored in usr/src/linux-headers-5.4.19-91/include .

so i tried to add the path of usr/src/linux-headers-5.4.19-91/include using export PATH – didnt work

tried to use the makefile inside usr/src/linux-headers-5.4.19-91/ hoping that it would be installed next but i am getting no rule to make target arch/x86/tools/relocs_32.c

and now i am trying to include this path to my CMake file (rn i am noob in cmake) using this code :

target_include_directories (driver PUBLIC usr/src/linux-headers-5.4.19-91/include)
target_include_directories (driver PUBLIC usr/src/linux-headers-5.4.19-91/include/config)
target_include_directories (driver PUBLIC usr/src/linux-headers-5.4.19-91)

again it dosent work .
is there any way for me to include the files not using the Cmake or if i have to how can i include them ? do they need to be make install inside the library it self ?

EDIT: thanks to @KamilCuk for the answer which pushed me on the right track , I also found this link which has an amazing tutorial for people who just want to start System Programming .


Question Answer

his path to my CMake file

Linux Kernel Development is done with Make with a small Makefile script.

Do not use CMake. While it may be possible to integrate CMake with kernel development, I believe it would require substantial work and if you are learning, definitely out of scope.

how can i include them ?

They are just included by themselves by Kernel Makefile scripts. You can read documentation https://www.kernel.org/doc/html/latest/kbuild/modules.html , but really all that is needed to start is a short Makefile file with only 3 lines.

Create a file called Makefile with just 5 lines as presented here Makefile for Linux kernel module? and then type make. The chardev.o matches the file chardev.c with the source – change it if your file has different name.

do they need to be make install inside the library it self ?


in usr/include/linux but they are stored in usr/src/linux-headers-5.4.19-91/include .

There is user-space and kernel-space. To compiler a user-space program, /usr/include/linux is used. To compile a kernel module linux-headers are used. They are unrelated and shouldn’t be mixed.

Linux Kernel is not like writing normal programs in user-space. There is no main nor printf in the kernel.

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.