Linux 用于gcc/g+的简易makefiles+;
我的项目almst始终包括: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放入其中,它们就会自动为你构建
- 运行
$CC -c foo.cpp
- 提供了一些可以手动添加额外依赖项的方法
- 包括与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是合适的