C++ 用于将大量.cpp和.h编译成库的Makefile

C++ 用于将大量.cpp和.h编译成库的Makefile,c++,makefile,g++,cygwin,compilation,C++,Makefile,G++,Cygwin,Compilation,我在Cygwin下用gcc/g++运行Windows7。将一组.cpp(C++源代码)和.h(头文件)文件编译到静态库(.dll)中的Makefile格式(扩展名,我认为是.mk?)是什么。假设我有一组可变的文件: file1.cpp 文件1.h file2.cpp 文件2.h file3.cpp 文件3.h 将这些文件编译成静态库的makefile格式(和扩展名)是什么?(我对Makefile非常陌生)最快的方法是什么?如果您希望GNU make自动找到它,扩展名将是完全没有的,该文件名

我在Cygwin下用gcc/g++运行Windows7。将一组.cpp(C++源代码)和.h(头文件)文件编译到静态库(.dll)中的Makefile格式(扩展名,我认为是.mk?)是什么。假设我有一组可变的文件:

  • file1.cpp
  • 文件1.h

  • file2.cpp

  • 文件2.h

  • file3.cpp

  • 文件3.h


将这些文件编译成静态库的makefile格式(和扩展名)是什么?(我对Makefile非常陌生)最快的方法是什么?

如果您希望GNU make自动找到它,扩展名将是完全没有的,该文件名为
Makefile
(或
Makefile

至少,gnumake允许您依赖于某些自动变量,这些变量单独让您控制以C/C++文件作为输入的大部分构建过程。这些变量包括
CC
CPP
CFLAGS
CPPFLAGS
CXX
cxflags
,以及
LDFLAGS
。这些控件控制到C/C++预处理器、编译器和链接器(生成称为“程序可执行文件”的程序,或者简单地说是“您正在编译的程序”)的开关,该链接器将使用
make

GNU make还包括许多隐式规则,这些规则旨在使它能够从C/C++源代码自动构建程序,因此您不必[总是]编写自己的规则

例如,即使没有makefile,如果您试图运行
makefoobar
,gnumake也会尝试首先从
foobar.c
foobar.cpp
中构建
foobar.o
,如果找到了,则调用适当的编译器,然后尝试通过汇编(包括链接)来构建
foobar
它的部分来自系统库和
foobar.o
。简而言之,GNUMake知道如何构建
foobar
程序,即使没有makefile——这要归功于隐式规则。您可以通过使用
-p
开关调用
make
来查看这些规则


有些人喜欢依赖GNU make的隐式规则数据库来拥有精简和简短的make文件,其中只指定了特定于他们项目的文件,而有些人甚至可以禁用整个隐式规则数据库(使用
-r
开关)并通过指定makefile中的所有内容来完全控制构建过程。我不会对这两种策略的有效性发表评论,但请放心,这两种策略在某种程度上都是有效的。

在构建dll时,可以设置很多选项,但如果您是从命令行执行此操作,可以使用以下基本命令:

gcc -shared -o mydll.dll file1.o file2.o file3.o
下面是一个makefile(通常称为
makefile
),它将处理整个构建过程:

# You will have to modify this line to list the actual files you use.
# You could set it to use all the "fileN" files that you have,
# but that's dangerous for a beginner.
FILES = file1 file2 file3

OBJECTS = $(addsuffix .o,$(FILES)) # This is "file1.o file2.o..."

# This is the rule it uses to assemble file1.o, file2.o... into mydll.dll
mydll.dll: $(OBJECTS)
    gcc -shared $^ -o $@    # The whitespace at the beginning of this line is a TAB.

# This is the rule it uses to compile fileN.cpp and fileN.h into fileN.o
$(OBJECTS): %.o : %.cpp %.h
    g++ -c $< -o $@         # Again, a TAB at the beginning.
#您必须修改此行以列出您使用的实际文件。
#您可以将其设置为使用您拥有的所有“fileN”文件,
#但这对初学者来说是危险的。
FILES=file1 file2 file3
OBJECTS=$(addsuffix.o,$(FILES))#这是“file1.o file2.o…”
#这是它用来组装file1.o、file2.o。。。导入mydll.dll
mydll.dll:$(对象)
gcc-shared$^-o$@#此行开头的空白是一个选项卡。
#这是它用来将fileN.cpp和fileN.h编译成fileN.o的规则
$(对象):%.o:%.cpp%.h
g++-c$<-o$#同样,开头是一个选项卡。
现在要构建
mydll.dll
,只需键入“make”

几张便条。如果只键入“make”而不指定makefile或目标(要构建的对象),make将尝试使用默认makefile(“GNUMakefile”、“makefile”或“makefile”)和默认目标(makefile中的第一个,在本例中为
mydll.dll