主机和目标的 Makefile

Posted

技术标签:

【中文标题】主机和目标的 Makefile【英文标题】:Makefile for host & target 【发布时间】:2018-02-27 15:48:06 【问题描述】:

我的问题是关于 linux 上的编译错误。每次我尝试编译程序时,它都会给我这个错误。我尝试了不同的东西,但没有运气。

*** 没有规则可以创建目标 '/pthread.d',这是 '/thread.exe' 所需要的。停下来。

程序的makefile(pthread如下:

SOURCES=pthread.cpp   
OBJECTS=$(addprefix $(BUILD_DIR)/, $(SOURCES:.cpp=.o))   
DEPS=$(addprefix $(BUILD_DIR)/, $(SOURCES:.cpp=.d))   
EXE=thread.exe    
CXXFLAGS=-I.    
LIBS=-pthread    

//Making for host > make ARCH=host
ifeq ($(ARCH),host)    
CXX=g++    
BUILD_DIR=build/host    
BIN_DIR=bin/host    
endif    


//Making for target > make ARCH= target    
ifeq ($(ARCH),target)    
CXX=arm-rpizw-g++    
BUILD_DIR=build/target    
BIN_DIR=bin/target    
endif    

all: $(BIN_DIR)/$(EXE)    

$(BIN_DIR)/$(EXE): $(DEPS) $(OBJECTS)    
    mkdir -p $(BIN_DIR)    
    $(CXX) $(CXXFLAGS) -o $@ $(OBJECTS)    

$(BUILD_DIR)/%.d: %.cpp    
    mkdir -p $(BUILD_DIR)     
    $(CXX) -MT$(@:.d=.o) -MM $(CXXFLAGS) $^ > $@    

$(BUILD_DIR)/%.o: %.cpp    
    mkdir -p $(BUILD_DIR)    
    $(CXX) -c $< -o $@ $(CXXFLAGS)    

ifneq ($(MAKECMDGOALS), $(filter $(MAKECMDGOALS),clean help))    
-include $(DEPS)    
endif    

clean:    
    -rm -rf bin/    
    -rm -rf build/    

【问题讨论】:

这不是你的问题,但这是个坏主意。 SOURCES=pthread.cpp 考虑将源文件命名为更独特的名称,以免与官方库文件混淆。并不是说pthread.cpp 存在于任何库中,但请考虑例如您的该源的标头是否称为pthread.h... yikes 谢谢贾斯汀,这是一个很好的观点。 :) 【参考方案1】:

BUILD_DIR=build/target 后面可能有空格。因此,$(DEPS) 解析为:

 build/target   /pthread.d

...,因此 make 将尝试创建 /pthread.d(和 build/target...)。赋值时,make 会丢弃任何前面的空格,但不会丢弃尾随的空格。它会删除尾随注释,但不会删除行尾和注释之间的空格。

为了调试这种类型的问题,将$(info) 行添加到您的makefile 中通常很有用:

$(info DEPS=_$(DEPS)_)

然后运行看看有没有意外的值。

【讨论】:

感谢您的有用评论。既有你的建议,也有其他一些简单的错误,我现在解决了这个问题。使用 info 变量确实很好。

以上是关于主机和目标的 Makefile的主要内容,如果未能解决你的问题,请参考以下文章

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

MakefileMakefile 中 LINUXINCLUDE 的作用

makefile

Makefile基础

makefile