一点一点学写Makefile(5)-获取文件所在路径

本文介绍如何在Makefile中动态获取工程的绝对路径,以确保代码在任意目录下都能正确编译。通过示例代码展示了如何定义源文件、目标文件路径,并讨论了静态库与动态库的链接问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天因为工作上的事情忙的焦头烂额,到这几天没有写博客,现在补上。

我们在开发一套代码时,应该保证工程放到任何一个目录中均可以编译成功,但是有时候链接库的时候会造成编译错误,本次就会告诉大家如何动态的获得工程所在的绝对路径

代码下载目录 选择Makefile-5


//makefile
CROSS = 
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = 
CFLAGS = $(DEBUG) -Wall -c
MV = mv -f
RM = rm -rf
LN = ln -sf


TOP_PATH = $(shell pwd)
SRC_PATH = $(TOP_PATH)/src/
BIN_PATH = $(TOP_PATH)/bin/
LIB_PATH = $(TOP_PATH)/lib/
INC_PATH = $(TOP_PATH)/include/

SRCS = $(wildcard $(SRC_PATH)*.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))
#LIBS += $(LIB_PATH)libconfig.a
LIBS += -lconfig

VERSION = 1.0.0.0
TARGET = adx$(VERSION)

all:$(TARGET)
	$(MV) $(TARGET) $(BIN_PATH)
	$(LN) $(BIN_PATH)/$(TARGET) $(BIN_PATH)/adx 

$(TARGET) : $(OBJS)
	$(CXX) $^ -o $@ -L$(LIB_PATH) $(LIBS)

$(OBJS):%.o : %.cpp
	$(CXX) $(CFLAGS) $< -o $@ -I$(INC_PATH)

.PHONY : clean
clean:
	$(RM) $(TARGET) $
### Makefile中VPATH变量的用法 在Makefile中,`VPATH`用于指定源文件和头文件所在的目录列表。这使得构建过程可以在多个子目录中找到所需的`.c`或`.h`文件而无需将它们全部放在同一目录内。 当定义了`VPATH`之后,在执行编译指令时,如果找不到所需的目标或依赖项,则会依次到`VPATH`所设置的各个路径下去查找相应的文件[^1]。例如: ```makefile VPATH = src inc ``` 此配置表示编译器将在`src`和`inc`这两个相对路径下自动搜索所有的源码(.c)以及头文件(.h),从而简化项目结构并保持整洁有序[^2]。 然而需要注意的是,默认情况下仅通过设定`VPATH`并不能让预处理器识别额外的包含路径。因此为了使C/C++预处理能够正确解析#include语句中的外部库位置,通常还需要借助gcc/g++编译器参数 `-I` 来显式声明附加的include路径。 另外一个重要细节是在编规则时应采用 `$^` 和 `$@` 变量代替具体的文件名,因为这样可以让make更灵活地处理来自不同目录下的输入文件,并确保中间产物如object files被放置在一个合适的位置而不是混杂在一起[^3]。 最后值得注意的一点是虽然 `vpath` 关键字也用来辅助定位资源但它的工作方式不同于全局性的 `VPATH` 设置——它允许基于特定模式(比如扩展名为 `.cpp` 或者 `.h` 的文件)进行更加精细的选择性匹配[^5]。 #### 示例代码片段展示如何利用 VPATH 构建多级目录项目的 Makefile 文件: 假设有一个简单的 C 语言程序分布在两个不同的子文件(src, inc): ```plaintext project/ ├── Makefile ├── inc/ │ └── myheader.h └── src/ └── main.c ``` 下面是一个可能适用于此场景的基础版本 Makefile : ```makefile CC=gcc CFLAGS=-g $(addprefix -I,) LDFLAGS= SRCDIR=src INCDIR=inc OBJDIR=obj TARGET=myapp VPATH=$(SRCDIR):$(INCDIR) OBJS=$(patsubst %.c,$(OBJDIR)/%.o,$(wildcard $(SRCDIR)/*.c)) all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ $(OBJDIR)/%.o : %.c mkdir -rf $(OBJDIR) $(TARGET) ``` 在此例子中,`VPATH` 被设为 `src:inc` ,意味着所有未找到的对象都会在这两个地方尝试获取其副本。同时注意到对于 object file 输出路径进行了自定义(`obj/`)以避免污染顶层工作区[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值