2017-11-17 348 views
0

我有点奇怪的大小写,我正在努力弄清楚。我有一个C++项目,我以一些.cpp文件开始,我需要从多个应用程序使用的多个远程目录中编译一些源文件。这并不理想,但这是我的开发组使用的传统目录/编译结构。Make:利用VPATH编译和链接不同扩展名的文件

其他项目利用VPATH来实现这一点。但是,它们最终会对所链接的所需对象列表进行硬编码,而且这种方法对我来说看起来不够优雅或灵活。我想动态编译和链接所有内容。另一个潜在的复杂情况是,这些远程VPATH目录中的某些目录具有.c扩展名的文件(即使这些扩展名编译为C++)而不是.cpp。

我目前的解决方案:

# Directory for object files 
OBJ_DIR = build 

CPPSRC := $(wildcard *.cpp) 
CSRC := $(wildcard *.c) 
OBJ := $(CSRC:%.c=$(OBJ_DIR)/%.o) $(CPPSRC:%.cpp=$(OBJ_DIR)/%.o) 

# Directory for output binaries 
BIN_DIR = bin 

# Name of binary executable 
OUTPUT = foo 

# VPATH allows you to specify other directories to search for prereqs in 
VPATH = /one/remote/dir /another/remote/dir 

# 'make all' 
all: $(BIN_DIR)/$(OUTPUT) 

# 'make clean' 
clean: 
    @rm -rf $(BIN_DIR) 
    @rm -rf $(OBJ_DIR) 

$(OBJ_DIR)/%.o: %.cpp 
    @mkdir -p $(OBJ_DIR) 
    $(CXX) -c $< -o [email protected] 

$(OBJ_DIR)/%.o: %.c 
    @mkdir -p $(OBJ_DIR) 
    $(CXX) -c $< -o [email protected] 

$(BIN_DIR)/$(OUTPUT): $(OBJ) 
    @mkdir -p $(BIN_DIR) 
    $(CXX) -g -ansi -Wall -Werror -o [email protected] $(OBJ) 

其结果是,一切都被编译和链接,除了在我的VPATH目录中的文件。我怀疑这可能是因为一旦我的$(OBJ)prereq被评估,结果对象本身都不在VPATH中,只是源文件。

我可以采取更好的方法吗?我不能轻易更改这些远程VPATH目录的内容,因为它们被不同所有者的许多不同应用程序使用。

+0

MadScientist的解决方案正是我所需要的,但他提到的警告将让我在将来从这种事情中转移出来...... –

回答

2

综观:

CPPSRC := $(wildcard *.cpp) 
CSRC := $(wildcard *.c) 
OBJ := $(CSRC:%.c=$(OBJ_DIR)/%.o) $(CPPSRC:%.cpp=$(OBJ_DIR)/%.o) 

$(BIN_DIR)/$(OUTPUT): $(OBJ) 

第一行说,让所有在我的当前目录中匹配的模式*.cpp的文件。第二行说,获取当前目录中与*.c模式匹配的所有文件。第三行说,将所有这些源文件转换为$(OBJ_DIR)目录中的目标文件名。

最后一行说,当你想建立$(BIN_DIR)/$(OUTPUT)时,确保先建立所有这些目标文件。

你没有告诉过它应该为它可能在其他地方找到的源创建任何目标文件(例如,如/one/remote/dir/another/remote/dir)。那么为什么它应该尝试构建它们呢?

你必须找出这些文件并将它们添加到你的对象列表中。

你可以尝试这样的事:

VPATH = /one/remote/dir /another/remote/dir 
OBJ += $(patsubst %,$(OBJ_DIR)/%.o,$(notdir $(basename $(wildcard $(addsuffix /*.cpp,$(VPATH)) $(addsuffix /*.c,$(VPATH)))))) 

这增加了/*.cpp/*.c后缀在$(VPATH)每个目录下,然后就一个通配符来获取所有匹配的文件,然后采取基本名(去掉.cpp.c后缀),然后删除目录路径,然后将每个基本文件名转换为$(OBJ_DIR),并将.o添加到最后。当然,如果你的系统中任何地方有两个具有相同基本名称的文件,那么你运气不好,你将不得不做更复杂的事情,例如保留目录结构。

相关问题