Kubuntu环境下g++ 7.5.0与GNU Make配置头文件路径失败问题求助
解决Kubuntu下G++/Make编译时头文件路径与Makefile问题
嘿,我来帮你搞定这个头疼的编译问题!你的核心需求是让源文件不用写#include "../header/archiver.h"就能找到头文件,同时修正Makefile里的错误,咱们一步步来:
1. 先搞清楚-I参数的正确用法
你之前用g++ -I/header报错是两个原因:
-I/header是绝对路径,系统会去根目录下找/header文件夹,而你的header是当前项目目录下的子目录,应该用相对路径:-I./header或者更简洁的-Iheader- 单独运行这个命令时你没指定要编译的源文件,所以g++才会报
fatal error: no input files,不过咱们主要是要把这个参数加到Makefile里,不用单独跑命令
2. 修正你的Makefile
你的原Makefile有几个小问题:编译时没加头文件路径、输出目标处理不当、依赖变量使用错误,下面是修改后的版本,我会逐行解释:
# 指定编译器 CC = g++ # 编译参数:-c(只编译不链接)、-Wall(开启所有警告)、-Iheader(添加头文件搜索路径) CFLAGS = -c -Wall -Iheader # 目标文件列表 objects = bin/main.o bin/archiver.o # 最终生成的可执行文件(建议起个有意义的名字,比如archiver) EXECUTABLE = archiver # 默认目标:先编译所有.o文件,再链接成可执行文件 all : $(objects) $(CC) -o $(EXECUTABLE) $(objects) # 编译规则:把source下的.cpp文件编译成bin下的.o文件 bin/%.o : source/%.cpp # $< 代表当前规则的第一个依赖文件(也就是对应的source/*.cpp) # $@ 代表当前规则的目标文件(也就是对应的bin/*.o) $(CC) $(CFLAGS) $< -o $@ # 清理规则:删除可执行文件和所有.o文件 .PHONY : clean clean : rm -rf $(EXECUTABLE) $(objects)
关键改动说明:
- 在
CFLAGS里添加了-Iheader,这样g++会自动在header目录下找头文件,你在源文件里直接写#include "archiver.h"或者#include <archiver.h>都能生效 - 编译规则里直接用
-o $@指定输出到bin目录,去掉了mv命令,避免误移动其他.o文件 - 新增了
EXECUTABLE变量统一管理可执行文件名,比原来的build更清晰 - 用
$<替代了$?,$<精准指向当前要编译的源文件,比$?(所有比目标新的依赖)更适合单文件编译场景 - clean规则里修正了删除的目标,只删可执行文件和.o文件,去掉了没用的
all
3. 额外注意事项
- 确保
bin目录已经存在,如果没有,要么手动创建mkdir bin,要么在Makefile里加一个创建目录的规则:# 在all目标前先创建bin目录 all : create_bin $(objects) $(CC) -o $(EXECUTABLE) $(objects) create_bin: mkdir -p bin - 源文件里的头文件引用直接写成
#include "archiver.h"就可以了,不用加相对路径
这样修改后,你直接运行make就能正常编译,运行make clean就能清理生成的文件啦!
内容的提问来源于stack exchange,提问作者Rylan Yancey
相关产品推荐
相关产品推荐

