我有点奇怪的大小写,我正在努力弄清楚。我有一个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目录的内容,因为它们被不同所有者的许多不同应用程序使用。
MadScientist的解决方案正是我所需要的,但他提到的警告将让我在将来从这种事情中转移出来...... –