在 Linux 下用 C++ 编写“驱动” 这个说法需要稍微澄清一下,因为 Linux 内核本身不支持直接用标准 C++ 写内核模块(驱动),但可以用 C++ 的受限制子集来写。
下面我分 三种常见情况 给你讲清楚,并给示例。
官方推荐:用 C 写 可以用 C++,但只能使用极受限的 C++(不能 STL、不能异常、不能 RTTI)
Linux 内核:
libstdc++new / deletestd:: 容器所以:
不能写“普通 C++ 程序”当驱动
hello.cppextern "C" {
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
}
static int __init hello_init(void) {
printk(KERN_INFO "Hello from C++ kernel module\n");
return 0;
}
static void __exit hello_exit(void) {
printk(KERN_INFO "Goodbye from C++\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("you");
⚠️ 注意:
extern "C" 里obj-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
例如:
+-------------------+
| 用户态 C++ 程序 |
| (控制 / 逻辑) |
+--------+----------+
|
v
+-------------------+
| ioctl / sysfs |
+--------+----------+
|
v
| 内核 C 驱动 |
如果你只是想:
✅ 直接用 C++ 写用户程序即可
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main() {
int fd = open("/dev/led", O_WRONLY);
write(fd, "1", 1);
close(fd);
}
❌ 以下情况不建议:
✅ 适合:
file_operationsioctl / mmap如果你愿意,可以告诉我:
我可以直接给你 对应完整驱动模板。