Makefile用于将一些.cpp和.h编译成lib

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Makefile用于将一些.cpp和.h编译成lib相关的知识,希望对你有一定的参考价值。

我在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很新)最快的方法是什么?

答案

扩展名根本不会,如果你想让GNU make自动找到它,那么文件名为Makefile。

Make具有自动变量,可以单独控制C / C ++文件中的大部分构建过程。这些变量包括CCCPPCFLAGSCPPFLAGSCXXCXXFLAGSLDFLAGS。这些将控制切换到C / C ++预处理器,编译器,平台对象和程序链接器(生成所谓的“程序可执行文件”的程序,或plainspeak“您正在编译的程序”)。

GNU make还包含许多隐式规则,这些规则是为了从C / C ++源代码构建程序而定制的,因此您不必从头开始编写这些规则。

例如,即使没有makefile,如果你尝试make foobar,GNU Make将尝试首先从foobar.ofoobar.c构建foobar.cpp,如果它找到,通过调用适当的编译器,然后将尝试通过汇编(包括链接)来构建foobar来自系统库和foobar.o的部件。简而言之,GNU Make知道如何构建foobar程序,即使没有makefile存在 - 这要归功于隐式规则。您可以通过使用-p开关调用Make来查看这些规则,例如: make -p

有些人喜欢依赖GNU Make隐式规则数据库来创建精简版和简短的makefile,其中只指定了特定于他们项目的那些,而有些人可能会禁用整个隐式规则数据库(使用-r开关)并且已经完整通过从头开始指定所有内容来控制构建过程。我不会评论任何一种策略的有效性,但请放心,两者在某种程度上都有效。

另一答案

在构建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)。

以上是关于Makefile用于将一些.cpp和.h编译成lib的主要内容,如果未能解决你的问题,请参考以下文章

使用 G++ 编译多个 .cpp 和 .h 文件

Qt下如何编译库

修改makefile,将wpa_cli编译成库

使用makefile编译多个文件(.c , .cpp , .h等)

如何在生成文件中动态重命名目标文件

如何将源文件编译成库文件