在 Linux 下用 C/C++ 编写驱动,通常指的是 内核模块(Kernel Module),而不是应用层的 C++ 程序。
重要结论先说:
✅ Linux 驱动一般用 C 写,不推荐用 C++ 写
❌ 内核中不支持标准 C++(无 STL、无异常、无 RTTI)
下面我分几种情况说明,并给你可运行的示例。
Linux 内核:
new / deletetry/catch)vector、string 等)✅ 官方推荐:纯 C
sudo apt install build-essential linux-headers-$(uname -r)
#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, Linux driver!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, Linux driver!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("YourName");
MODULE_DESCRIPTION("A simple Linux driver");
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
sudo rmmod hello
dmesg | tail
✅ 你会看到内核日志输出
driver/
├── hello.c
├── logic.cpp
├── logic.h
#ifdef __cplusplus
extern "C" {
#endif
void logic_run(void);
#ifdef __cplusplus
}
#endif
#include "logic.h"
#include <linux/kernel.h>
void logic_run(void)
{
printk(KERN_INFO "C++ logic running\n");
}
⚠️ 限制:
进阶结构:
module_init()
└─ 注册字符设备
├─ open
├─ read
├─ write
└─ release
关键 API:
register_chrdev()file_operationscopy_to_user()copy_from_user()如果你需要,我可以给你一个 完整字符设备驱动示例(LED / 按键 / 虚拟设备)
✅ 可以,但仍然是 C 接口 + C++ 内部实现
| 需求 | 建议 |
|---|---|
| 学习 Linux 驱动 | ✅ 用 C |
| 写生产驱动 | ✅ 用 C |
| 复用已有 C++ 算法 | ✅ C 包一层 |
| 想用 STL | ❌ 不可能 |
如果你愿意,可以告诉我:
我可以直接给你 对应场景的完整示例代码。