有一个很好的makefile(来自本教程:https://sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile)。但是,同样如网站上所述,此makefile将单个目录中的所有.c和.cpp文件编译为可执行文件。
program_NAME := myprogram
program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS :=
program_LIBRARY_DIRS :=
program_LIBRARIES :=
CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))
.PHONY: all clean distclean
all: $(program_NAME)
$(program_NAME): $(program_OBJS)
$(LINK.cc) $(program_OBJS) -o $(program_NAME)
clean:
@- $(RM) $(program_NAME)
@- $(RM) $(program_OBJS)
distclean: clean
如何修改此makefile以便编译以下程序?例如,如果我的目录有以下结构:
/project
Makefile
main.cpp
/src
Class1.cpp
Class2.cpp
/obj
Class1.obj
Class2.obj
/bin
myProgram
/inc
Class1.h
Class2.h
/lib
libX.a
答案 0 :(得分:0)
丹。正如其他人在评论中提到的那样,你真的应该使用CMake或其他一些生成makefile(和其他项目)的构建系统,而不是手工创建一个makefile。
使用我在本教程中提供的makefile,了解每个变量代表的内容非常重要。 program_C_SRCS
和program_CXX_SRCS
表示要构建的C和C ++源文件。您可以修改通配符,以便从“src”目录而不是从当前目录中选取它们。同样,OBJS
变量定义作为输出生成的目标文件列表。您可以类似地修改它的构造方式,以便它们在“obj”子目录中发出(虽然没有进一步测试,但我不确定xo从x.cpp生成的正常推断是否会在跨越不同目录时存活......你必须亲自看看。
至于包含来自不同目录的标题,program_INCLUDE_DIRS
是为此目的而定义的。只需使用program_INCLUDE_DIRS := inc
,就应将“inc”文件夹添加到要搜索包含的目录列表中。同样,您可以通过将“lib”目录添加到program_LIBRARY_DIRS
并将“X”添加到program_LIBRARIES
来链接库libX.a库。
无论如何,了解makefile的工作方式对于历史目的和调试/理解生成makefile的工具如何工作都很有用。但是,在这个时代,编写自己的makefile确实是不可取的。请,请花一些时间学习CMake。虽然在学习像CMake这样的新工具上有一些前期时间投入,但从长远来看,它会为你编写易碎且构建缓慢的极其扭曲的Makefile节省大量时间。