【问题标题】: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++ 文件作为输入来控制大部分构建过程。这些变量包括CCCPPCFLAGSCPPFLAGSCXXCXXFLAGSLDFLAGS。它们控制make 将使用的 C/C++ 预处理器、编译器和链接器(最终将您的程序组装在一起的程序)的开关。

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

    例如,即使没有 makefile,如果您尝试运行make foobar,GNU make 将尝试首先从foobar.cfoobar.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)。

      【讨论】:

        猜你喜欢
        • 2011-03-13
        • 2014-03-24
        • 1970-01-01
        • 2015-01-05
        • 1970-01-01
        • 2019-06-17
        • 1970-01-01
        • 2015-10-08
        相关资源
        最近更新 更多