0

有这个不错的 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
4

1 回答 1

0

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

使用我在教程中提供的 makefile,了解每个变量代表什么很重要。program_C_SRCSprogram_CXX_SRCS表示要构建的 C 和 C++ 源文件。您可以修改通配符,以便从“src”目录而不是从当前目录中获取它们。同样,OBJS变量定义了作为输出生成的目标文件列表。您可以类似地修改它的构造方式,以便它们在“obj”子目录中发出(尽管没有进一步测试,我不确定从 x.cpp 生成 xo 的正常推断是否会存在,如果它们跨越不同的目录......你必须自己看看)。

至于包含来自不同目录的标题,program_INCLUDE_DIRS正是为此目的而定义的。只需使用program_INCLUDE_DIRS := inc,“inc”文件夹应添加到要搜索的目录列表中。program_LIBRARY_DIRS同样,您可以通过将“lib”目录添加到并将“X”添加到 .a 库来链接库 libX.a 库program_LIBRARIES

无论如何,了解 makefile 如何工作对于历史目的和调试/了解生成 makefile 的工具如何工作都是有用的。但是,在当今时代编写自己的 makefile 确实是不可取的。请,请,请花一些时间来学习CMake。虽然在学习 CMake 等新工具方面需要投入一些前期时间,但从长远来看,它会为您节省大量时间,而不是编写易碎且构建缓慢的极度扭曲的 Makefile。

于 2013-07-01T22:58:12.340 回答