【发布时间】:2012-06-30 13:31:50
【问题描述】:
我正在尝试创建一个 Makefile,除其他外,它会输出一些 library1.a,之后我将重用它来创建可执行文件。现在这是我的困境:我想让这个过程通用,这样我就不必每次添加一些文件时都编辑 Makefile。这是我的想法:
#Declare phony targets
.PHONY: all clean build_utils
#Compiler
CXX = g++
#Flags
CXXFLAGS = -Wall -Wextra -Wconversion -Werror -pedantic -std=c++0x -O2
#Directories
OUTPUT_DIR = _output/linux
INTERMEDIATE_DIR = _intermediate/linux
UTILS_DIR = utils
all: $(OUTPUT_DIR)/libUtils.a
$(OUTPUT_DIR)/libUtils.a:
ar rcs $@ $(INTERMEDIATE_DIR)/utils/$(patsubst %.cpp, %.o, $(wildcard $(UTILS_DIR)/ *.cpp))
#create .o files in %INTERMEDIATE_DIR/utils
build_utils: $(UTILS_DIR)/ *.cpp $(UTILS_DIR)/ *.h
$(CXX) -c $(CXXFLAGS) $^ -o ## What must be placed here? ##
所以,基本上,我希望在临时目录中创建所有目标文件,然后将其存档在libUtils.a 中,但我不知道如何要求编译器根据输入文件。基本上,我的标准规定,对于每个 .cpp 文件,我都应该获得一个目标文件,但我不确定如何执行此操作。我不想为每个 .o 文件创建单独的目标,因为它太乱了。
【问题讨论】:
-
虽然这不是直接回答您的问题,但我建议您查看 cmake 为您生成 Makefile。它似乎具有您想要内置的自动化类型。
-
@jpe cmake 似乎比手动操作要复杂得多。我必须投入几天的时间,现在我急于编译这个项目。
-
在 CMake 中,您实际上可以从匹配特定模式的所有文件创建一个库,大约三四行,这比 Makefile 更清晰易读。并不是说在 Makefile 中“手动”执行它一定是一个坏主意,只是不要被 CMake 认为可能看起来复杂而复杂 - 它提供了许多不错的功能,但并不难习惯.
-
@sonicwave 好吧,当您是程序员团队的一员并且大家都处于尝试找出最适合的工具的阶段时,也许使用它是个好主意对于这个特定的实现。另一方面,当你是团队中唯一的程序员并且每个人都想知道“为什么要花这么长时间来实现我们在 10 分钟内编写的这两个公式”,那么你需要让事情变得非常简单,而且,还可以扩展。是的,我本可以花半周时间阅读有关 cmake 的内容,但另一方面,我还需要编写代码……