You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行make时提示stdio.h不存在,但gcc编译正常且已安装libc6-dev

解决用户态程序误用内核模块Makefile导致的stdio.h找不到问题

你遇到的核心问题是误用了Linux内核模块的编译框架来编译用户态应用程序:

  • 直接用gcc编译能成功,是因为gcc默认使用用户态编译环境,可正常读取/usr/include下的头文件;
  • 但你的Makefile里使用了obj-m += program2.o,并调用/lib/modules/$(shell uname -r)/build的内核编译系统——这套环境专为编译内核模块设计,内核空间不存在stdio.h这类用户态标准库头文件,因此必然报错。

解决方案

1. 替换为用户态程序的Makefile

删除原有内核模块风格的Makefile,替换为适配用户态应用的编译规则:

CC = gcc
CFLAGS = -Wall -g
LDFLAGS = -lX11

TARGET = program2

all: $(TARGET)

$(TARGET): program2.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)

clean:
	rm -f $(TARGET) *.o

2. 安装X11开发依赖

你的代码依赖X11库,需安装对应的开发包:

sudo apt-get install libx11-dev

3. 编译运行

执行make即可完成正常编译,之后运行./program2启动程序。


额外说明:

  • 内核模块编译框架用于编写运行在内核空间的驱动/模块,这类代码无法调用用户态标准库(如stdio.h、printf),也不存在main函数;
  • 你的代码是典型的用户态GUI程序,必须使用用户态编译工具链及规则。

内容的提问来源于stack exchange,提问作者Jasmine58850_01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 03:56:01