创建一个makefile并在子目录中编译

时间:2013-06-28 09:08:45

标签: c++

有一个很好的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

1 个答案:

答案 0 :(得分:0)

丹。正如其他人在评论中提到的那样,你真的应该使用CMake或其他一些生成makefile(和其他项目)的构建系统,而不是手工创建一个makefile。

使用我在本教程中提供的makefile,了解每个变量代表的内容非常重要。 program_C_SRCSprogram_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节省大量时间。