【问题标题】:Makefile for compiling a number of .cpp and .h into a libMakefile 用于将多个 .cpp 和 .h 编译到一个库中
【发布时间】:2010-06-22 11:46:51
【问题描述】:
我在 Cygwin 下使用 gcc/g++ 运行 Windows 7。将一组 .cpp(C++ 源代码)和 .h(头文件)文件编译成静态库 (.dll) 的 Makefile 格式(和扩展名,我认为是 .mk?)是什么。假设我有一组可变的文件:
- file1.cpp
file1.h
file2.cpp
file2.h
file3.cpp
file3.h
....
将它们编译成静态库的 makefile 格式(和扩展名)是什么? (我对 makefile 很陌生)最快的方法是什么?
【问题讨论】:
标签:
c++
makefile
g++
cygwin
compilation
【解决方案1】:
扩展名根本没有,如果您希望 GNU make 自动找到它,该文件称为 Makefile(或 makefile)。
至少,GNU make 允许您依赖某些自动变量,这些自动变量可以让您以 C/C++ 文件作为输入来控制大部分构建过程。这些变量包括CC、CPP、CFLAGS、CPPFLAGS、CXX、CXXFLAGS 和 LDFLAGS。它们控制make 将使用的 C/C++ 预处理器、编译器和链接器(最终将您的程序组装在一起的程序)的开关。
GNU make 还包含许多隐含规则,旨在使其能够从 C/C++ 源代码自动构建程序,因此您不必[总是]编写自己的规则。
例如,即使没有 makefile,如果您尝试运行make foobar,GNU make 将尝试首先从foobar.c 或foobar.cpp 构建foobar.o(如果找到),通过调用适当的编译器,然后将尝试通过从系统库和foobar.o 组装(包括链接)其部分来构建foobar。简而言之,即使没有 makefile 存在,GNU Make 也知道如何构建foobar 程序——这要归功于隐含的规则。您可以通过使用-p 开关调用make 来查看这些规则。
有些人喜欢依赖 GNU make 的隐式规则数据库来生成精简和简短的 makefile,其中只指定了特定于他们的项目的文件,而有些人可能会禁用整个隐式规则数据库(使用 @987654340 @switch) 并通过在其生成文件中指定所有内容来完全控制构建过程。我不会评论这两种策略的有效性,但请放心,两者都在一定程度上起作用。
【解决方案2】:
您可以在构建 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.
现在要构建mydll.dll,只需输入“make”。
一些笔记。如果你只输入“make”而不指定makefile或目标(要构建的东西),Make将尝试使用默认的makefile(“GNUMakefile”、“makefile”或“Makefile”)和默认目标(第一个makefile 中的一个,在本例中为 mydll.dll)。