假设我有一个.h和.c文件,最初是为内核空间编写的。
#ifndef __TREE_H__
#define __TREE_H__
/* #includes for kernel headers*/
struct tree_node_t{
int data;
struct tree_node_t *left;
struct tree_node_t *right;
};
struct tree{
int data;
struct tree_node_t *root;
};
void insert_node(struct tree *tree, int data);
#endif
可以说,相应的.c文件包含void insert_node fn的定义,它使用kmalloc()
创建tree_node并将其插入树中。我可以使用Makefile编译代码来编译内核模块,因为.h / .c文件是内核模块的一部分。
现在,我想在用户空间中使用相同的数据结构及其fns。我需要使用新的用户空间特定的makefile来编译它,这需要用kmalloc
和kfree
替换特定于内核的调用,例如malloc
和free
?如何使用#ifdef #else #endif的各种组合,以便通过使用相应的make文件在用户空间和内核空间中编译文件。
请等待:kmalloc/kfree
只是解释的简单例子。文件包含其他特定于内核的API,在用户空间中编译文件时需要将其排除/替换。
答案 0 :(得分:2)
您可以使用cannot find symbol
宏来区分编译目标:内核代码(已定义宏)或应用程序(未定义宏)。
这个宏在Linux内核中用于 uapi 标头和其他一些文件。例如,参见include/uapi/linux/ethtool.h。