在 Linux 上用 C++ 写驱动这件事,需要先澄清一个重要事实:
✅ Linux 内核驱动只能用 C 写(不能用标准 C++)
❌ 不能用 STL、new/delete、异常、RTTI、libstdc++
不过,可以用“受限的 C++ 语法” 来写内核代码,比如:
下面我分 原理 → 示例 → 能不能用 C++ → 替代方案 给你讲清楚。
gcc,不是 g++iostreamvectornew / deletetry/catch)hello.c#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#define DEVICE_NAME "hello"
static int major;
static int hello_open(struct inode *inode, struct file *file) {
printk(KERN_INFO "hello open\n");
return 0;
}
static struct file_operations fops = {
.open = hello_open,
};
static int __init hello_init(void) {
major = register_chrdev(0, DEVICE_NAME, &fops);
printk(KERN_INFO "hello module loaded, major=%d\n", major);
return 0;
}
static void __exit hello_exit(void) {
unregister_chrdev(major, DEVICE_NAME);
printk(KERN_INFO "hello module unloaded\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("example");
Makefileobj-m += hello.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
编译 & 加载:
make
sudo insmod hello.ko
dmesg | tail
sudo rmmod hello
| 项目 | 是否支持 |
|---|---|
| class | ✅ |
| 构造函数 | ✅(不能抛异常) |
| 继承 | ✅(简单) |
| STL | ❌ |
| new/delete | ❌ |
| 异常 | ❌ |
| libstdc++ | ❌ |
内核里 没有 C++ 运行时,所以:
std::cout << "hello"; // ❌ 不可能
hello.cppextern "C" {
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
}
class HelloDevice {
public:
HelloDevice() {
printk(KERN_INFO "HelloDevice constructed\n");
}
};
static HelloDevice dev;
extern "C" int init_module(void) {
printk(KERN_INFO "C++ driver loaded\n");
return 0;
}
extern "C" void cleanup_module(void) {
printk(KERN_INFO "C++ driver unloaded\n");
}
MODULE_LICENSE("GPL");
⚠️ 注意:
extern "C"┌────────────┐
│ 用户程序 │ C / C++ / Qt / Python
└─────┬──────┘
│ ioctl / read / write
┌─────▼──────┐
│ 内核驱动 │ C(标准做法)
└─────┬──────┘
│
┌─────▼──────┐
│ 硬件 │
└────────────┘
✅ 逻辑用 C++ 写 ✅ 驱动用 C 写 ✅ 通过 ioctl / netlink / mmap 交互
| 需求 | 推荐方案 |
|---|---|
| 学习驱动 | C |
| 复杂逻辑 | 用户态 C++ |
| 高性能 | C 驱动 + C++ 用户程序 |
| 工业项目 | C 驱动 |
你可以直接告诉我:
我可以直接给你 可编译的完整驱动模板。