Linux 用于gcc/g+的简易makefiles+;

Linux 用于gcc/g+的简易makefiles+;,linux,dependencies,makefile,Linux,Dependencies,Makefile,我的项目almst始终包括: Foo.h和Foo.cpp对 一些额外的头文件util.h等 编写生成文件的最简单方法是什么 运行 $CC -c foo.cpp 对于每个.cpp文件,保留对其相应.h文件的依赖关系 提供了一些可以手动添加额外依赖项的方法 包括与my manuall set$LIBS变量的链接步骤 我使用Linux(Ubuntu)和gcc/g++。从这里开始从这里开始这是我的一个项目中的一个例子——你只需将新的对foo1.cc和foo1.h放入其中,它们就会自动为你构建

我的项目almst始终包括:

  • Foo.h和Foo.cpp对

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

  • 编写生成文件的最简单方法是什么

    • 运行

      $CC -c foo.cpp
      
    对于每个.cpp文件,保留对其相应.h文件的依赖关系

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

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

    从这里开始

    从这里开始

    这是我的一个项目中的一个例子——你只需将新的对
    foo1.cc
    foo1.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 $^ 
    

    下面是我的一个项目中的一个示例--您只需将新的对
    foo1.cc
    foo1.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 $^ 
    
    也许你可以退房

    如果您不熟悉CMake,它基本上是一个Makefile生成器(或XCode,或Visual Studio项目,等等,取决于平台),因此它允许您仅指定所需的变量,并为您处理头依赖性问题、生成Makefile等。

    也许您可以签出

    如果您不熟悉CMake,它基本上是一个Makefile生成器(或XCode,或Visual Studio项目,等等,取决于平台),因此它允许您仅指定所需的变量,并为您处理头依赖性问题、生成Makefile等。

    这方面如何:

    %.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 $@
    
    %.o:%.cpp%.h
    $(CC)-c$<-o$@
    #有些东西有额外的依赖性。(像util.h这样的标题不太可能出现。)
    #改变,但如果你真的想改变,你可以这样处理。)
    #
    #foo.o和bar.o都依赖于baz.h
    foo.o酒吧o:baz.h
    #foo.o还依赖于gab.h和jig.h
    foo.o:gab.h jig.h
    #您需要一个对象文件列表。您可以手动创建它:
    OBJ_FILES=foo.obar.osnaz.o#等等
    #…或者只抓取源目录中的所有文件:
    源文件=$(通配符*.cpp)
    OBJ_文件=$(源_文件:.cpp=.o)
    #可以从环境中获取,但不可取。
    LIBS=-lred-lblue
    最后一件事:$(OBJ_文件)
    $(CC)$(LIBS)$^-o$@
    
    这个怎么样:

    %.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 $@
    
    %.o:%.cpp%.h
    $(CC)-c$<-o$@
    #有些东西有额外的依赖性。(像util.h这样的标题不太可能出现。)
    #改变,但如果你真的想改变,你可以这样处理。)
    #
    #foo.o和bar.o都依赖于baz.h
    foo.o酒吧o:baz.h
    #foo.o还依赖于gab.h和jig.h
    foo.o:gab.h jig.h
    #您需要一个对象文件列表。您可以手动创建它:
    OBJ_FILES=foo.obar.osnaz.o#等等
    #…或者只抓取源目录中的所有文件:
    源文件=$(通配符*.cpp)
    OBJ_文件=$(源_文件:.cpp=.o)
    #可以从环境中获取,但不可取。
    LIBS=-lred-lblue
    最后一件事:$(OBJ_文件)
    $(CC)$(LIBS)$^-o$@
    
    请使用
    automake
    。您将获得适当的依赖项跟踪,生成符合的文件(例如,
    makeinstall
    做正确的事情,并尊重
    DESTDIR
    前缀
    ),能够根据需要检查系统异常,并支持构建适当的分发tarball

    这是一个最小的
    配置。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
    
    运行
    autoeconf-i
    生成配置脚本,然后运行
    /configure
    make


    这是一个。

    请使用
    automake
    。您将获得适当的依赖项跟踪,生成符合的文件(例如,
    makeinstall
    做正确的事情,并尊重
    DESTDIR
    前缀
    ),能够根据需要检查系统异常,并支持构建适当的分发tarball

    这是一个最小的
    配置。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
    
    运行
    autoeconf-i
    生成配置脚本,然后运行
    /configure
    make


    下面是一个。

    下面是一个简单的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依赖项行。只需在sources目录中创建脚本(我们称之为
    micmake
    ),使其可执行(
    chmod+x micmake
    )并键入


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

    下面是一个简单的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依赖项行。只需在sources目录中创建脚本(我们称之为
    micmake
    ),使其可执行(
    chmod+x micmake
    )并键入


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

    如果不依赖于头文件,则在进行更改后将无法重建。通常的
    .depend
    配方将修复它。多个问题解决了这个问题,包括在编译步骤中构建
    strip
    ,这似乎是一个非常糟糕的主意,尤其是对于开发。GNU makefile约定将剥离放在自己的目标中,
    install strip
    :正如我所说,它来自一个本地项目——我认为strip是合适的