【问题标题】:Easy makefiles for gcc/g++用于 gcc/g++ 的简单生成文件
【发布时间】:2011-04-14 08:59:08
【问题描述】:

我的项目几乎总是包括:

  1. Foo.h 和 Foo.cpp 对

  2. 一些额外的头文件 util.h 等

编写makefile最简单的方法是什么

  • 运行

    $CC -c foo.cpp
    

对于每个 .cpp 文件,保持与其对应的 .h 文件的依赖关系

  • 提供了一些我可以手动添加额外依赖项的方法
  • 包括与我手动设置的 $LIBS 变量的链接步骤。

我使用 Linux(Ubuntu) 和 gcc/g++。

【问题讨论】:

    标签: linux dependencies makefile


    【解决方案1】:

    从这里开始simple makefile for gcc

    【讨论】:

      【解决方案2】:

      这是我的一个项目中的一个例子——你可以简单地把新的foo1.ccfoo1.h放在那里,它们会自动为你构建:

      # determine all sources and from that all targets
      sources :=              $(wildcard *.cpp)
      programs :=             $(sources:.cpp=)
      
      ## compiler etc settings used in default make rules 
      CXX :=                  g++
      CPPFLAGS :=             -Wall 
      CXXFLAGS :=             -O3 -pipe 
      LDLIBS :=  
      
      # build all and strip programs afterwards 
      all:                    $(programs) 
                              @test -x /usr/bin/strip && strip $^ 
      

      【讨论】:

      • 在不依赖头文件的情况下,在某些情况下,在进行更改后不会重建。通常的.depend 配方会修复它。多个 SO 问题解决了该问题,包括 stackoverflow.com/questions/297514/…
      • 在编译步骤中构建strip 似乎是一个非常糟糕的主意,尤其是对于开发而言。 GNU makefile 约定将剥离放入自己的目标中,install-strip:gnu.org/prep/standards/standards.html#Makefile-Conventions
      • 正如我所说,它来自一个本地项目——我认为 strip 是合适的。
      【解决方案3】:

      也许你可以看看CMake

      如果您不熟悉 CMake,它基本上是一个 Makefile 生成器(或 XCode 或 Visual Studio 项目等,取决于平台),因此它可以让您只指定您需要的变量,并处理头文件依赖问题为你,makefile 生成等。

      【讨论】:

        【解决方案4】:

        这个怎么样:

        %.o: %.cpp %.h
            $(CC) -c $< -o $@
        
        # Some things have extra dependencies. (Headers like util.h are unlikely
        # to change, but you can handle them this way if you really want to.)
        #
        # foo.o and bar.o both depend on baz.h
        foo.o bar.o: baz.h
        
        # foo.o also depends on gab.h and jig.h
        foo.o: gab.h jig.h
        
        # You will need a list of object files. You can build it by hand:
        OBJ_FILES = foo.o bar.o snaz.o # and so on
        
        # ...or just grab all the files in the source directory:
        SOURCE_FILES = $(wildcard *.cpp)
        OBJ_FILES = $(SOURCE_FILES:.cpp=.o)
        
        # It is possible to get this from the environment, but not advisable.
        LIBS = -lred -lblue
        
        final-thing: $(OBJ_FILES)
            $(CC) $(LIBS) $^ -o $@
        

        【讨论】:

        • @Jack Kelly:是的,我熟悉 mad-scientist.net/make/autodep.html 等更高级的方法,但请看问题。
        【解决方案5】:

        请使用automake。您将获得适当的依赖跟踪、符合GNU Makefile Standards 的makefile(例如,make install 做正确的事情并尊重DESTDIRprefix)、根据需要检查系统怪癖的能力以及对构建的支持正确的分发 tarball。

        这是一个最小的configure.ac

                                                       -*- Autoconf -*-
        # Process this file with autoconf to produce a configure script.
        
        AC_PREREQ([2.61])
        AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
        AM_INIT_AUTOMAKE([foreign])
        
        # Checks for programs.
        AC_PROG_CXX
        
        # Checks for libraries.
        
        # Checks for header files.
        
        # Checks for typedefs, structures, and compiler characteristics.
        
        # Checks for library functions.
        
        AC_CONFIG_FILES([Makefile])
        AC_OUTPUT
        

        还有一个最小的Makefile.am

        ## Process this file with automake to generate Makefile.in
        bin_PROGRAMS = foo
        foo_SOURCES = foo.cpp bar.h baz.h quux.cpp
        

        运行autoreconf -i 生成配置脚本,然后运行./configuremake

        这是excellent autotools tutorial

        【讨论】:

          【解决方案6】:

          这是一个简单的 shell 脚本,它从给定目录中的所有 .cpp 文件构造一个 makefile:

          # !sh    
          if [ $# = 0 ]
          then
          echo -e "please give executable name"
          exit 1
          fi
          
          echo -e -n "CC=g++\nOPTIMS=\nLIBS= " > makefile
          
          echo >> makefile
          echo -n "$1: " >> makefile
          for fic in *.cpp
          do
          echo -n "${fic%\.cpp}.o " >> makefile
          done
          
          echo >> makefile
          echo -n -e "\t\$(CC) " >> makefile
          for fic in *.cpp
          do
          echo -n "${fic%\.cpp}.o " >> makefile
          done
          echo -n -e "-o $1 \$(OPTIMS) \$(LIBS)\n" >> makefile
          
          echo >> makefile
          for fic in *.cpp
          do
          g++ -MM $fic >> makefile
          echo -e "\t\$(CC) -c $fic \$(OPTIMS)\n" >> makefile
          done
          
          exit 0
          

          它使用 gcc 的 -MM 选项来创建 makefile 依赖行。只需在源目录中创建脚本(我们称之为micmake),使其可执行(chmod +x micmake)并输入

          ./micmake go
          

          它将创建一个 makefile 并且 make 命令编译您的项目。可执行文件名为go。如果您需要特殊的编译选项或库,您可以编辑 makefile。对于更复杂的项目和依赖项,您应该使用 automake、cmake 或 scons。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多