温馨提示×

怎样用linux c++写驱动

小樊
42
2026-09-11 01:55:38
栏目: 编程语言

在 Linux 下用 C++ 编写“驱动” 这个说法需要稍微澄清一下,因为 Linux 内核本身不支持直接用标准 C++ 写内核模块(驱动),但可以用 C++ 的受限制子集来写。

下面我分 三种常见情况 给你讲清楚,并给示例。


一、最常见情况:Linux 内核驱动(Kernel Module)

✅ 结论先说

官方推荐:用 C 写 可以用 C++,但只能使用极受限的 C++(不能 STL、不能异常、不能 RTTI)


1️⃣ 为什么不能用完整 C++

Linux 内核:

  • 没有 libstdc++
  • 没有 new / delete
  • 没有异常机制
  • 没有 std:: 容器

所以:

不能写“普通 C++ 程序”当驱动


2️⃣ 可用 C++ 子集写内核模块(示例)

示例:用 C++ 写简单字符设备驱动

hello.cpp
extern "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");

⚠️ 注意:

  • 所有 Linux 头文件必须放在 extern "C"
  • 不能写类成员函数调用 STL

3️⃣ Makefile(关键)

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++ 封装驱动逻辑(推荐方式)

✅ 实际工程常用方案

  • 驱动核心用 C 写
  • C++ 只做封装 / 用户态控制

例如:

+-------------------+
| 用户态 C++ 程序   |
| (控制 / 逻辑)     |
+--------+----------+
         |
         v
+-------------------+
| ioctl / sysfs     |
+--------+----------+
         |
         v
| 内核 C 驱动       |

三、用户态“驱动”(伪驱动)

如果你只是想:

  • 控制 GPIO
  • 操作串口
  • 读写设备文件

直接用 C++ 写用户程序即可

#include <fcntl.h>
#include <unistd.h>
#include <iostream>

int main() {
    int fd = open("/dev/led", O_WRONLY);
    write(fd, "1", 1);
    close(fd);
}

四、什么时候“不该”用 C++ 写驱动?

❌ 以下情况不建议:

  • PCI / USB 核心驱动
  • 中断处理
  • 高性能网络驱动
  • 官方内核代码

✅ 适合:

  • 简单字符设备
  • 学习 / 研究
  • 嵌入式封装层

五、建议学习路线

  1. 先学 C 内核模块
  2. 再学 file_operations
  3. 理解 ioctl / mmap
  4. 最后才尝试 C++ 封装

如果你愿意,可以告诉我:

  • 字符设备 / 块设备 / USB / 网络驱动?
  • 学习用还是产品用?
  • 嵌入式还是 x86?

我可以直接给你 对应完整驱动模板

0