linux的最小c ++ make文件

时间:2008-11-13 15:35:15

标签: c++ makefile compilation

我希望找到一个简单的推荐用于linux的“minimal”c ++ makefile,它将使用g ++编译和链接单个文件和h文件。理想情况下,make文件甚至不会包含物理文件名,只有.cpp到.o转换。生成这样一个makefile的最佳方法是什么,而不会陷入autoconf的恐怖?

当前目录包含,例如

t.cpp t.h

我想要创建一个makefile。我试过autoconf,但它假设.h是gcc而不是g ++。是的,虽然不是初学者,但我从几年前开始重新学习项目操作的最佳方法,因此我正在寻找自动化的方法来为小项目创建和维护makefile。

11 个答案:

答案 0 :(得分:30)

如果是单个文件,您可以输入

make t

它会调用

g++ t.cpp -o t

这甚至不需要在目录中使用Makefile,但如果你有t.cpp和t.c以及t.java等等,它会变得混乱。

也是一个真正的Makefile:

SOURCES := t.cpp
# Objs are all the sources, with .cpp replaced by .o
OBJS := $(SOURCES:.cpp=.o)

all: t

# Compile the binary 't' by calling the compiler with cflags, lflags, and any libs (if defined) and the list of objects.
t: $(OBJS)
    $(CC) $(CFLAGS) -o t $(OBJS) $(LFLAGS) $(LIBS)

# Get a .o from a .cpp by calling compiler with cflags and includes (if defined)
.cpp.o:
    $(CC) $(CFLAGS) $(INCLUDES) -c $<

答案 1 :(得分:18)

以下是我的代码片段目录中的通用makefile:

SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
BINS=$(SOURCES:.cpp=)

CFLAGS+=-MMD
CXXFLAGS+=-MMD

all: $(BINS)

.PHONY: clean

clean:
    $(RM) $(OBJECTS) $(DEPS) $(BINS)

-include $(DEPS)

只要您有一个.cpp源生成一个二进制文件,您就不需要任何其他内容了。我只在GNU make中使用它,依赖项生成使用gcc语法(也由icc支持)。如果您使用的是SUN编译器,则需要将“-MMD”更改为“-xMMD”。另外,请确保在粘贴此代码时clean:之后的行开头处的标签不会更改为空格,否则make会丢失分隔符错误。

答案 2 :(得分:8)

你看过SCons吗?

只需使用以下内容创建SConstruct文件:

Program("t.cpp")

然后输入:

scons

完成!

答案 3 :(得分:5)

假设没有预先配置的系统范围make设置:

CXX = g++
CPPFLAGS =        # put pre-processor settings (-I, -D, etc) here
CXXFLAGS = -Wall  # put compiler settings here
LDFLAGS =         # put linker settings here

test: test.o
    $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) test.o

.cpp.o:
    $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<

test.cpp: test.h

答案 4 :(得分:2)

一个相当小的GNU Makefile,使用预定义规则和auto-deps:

CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
    $(RM) *.o *.d program
-include $(wildcard *.d)

答案 5 :(得分:1)

你看过OMake吗?

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

OMakefile

.DEFAULT: $(CXXProgram test, test)

然后在Linux或Windows上输入:

omake

作为奖励,您自动获得:

  • 使用-j选项进行并行构建(与make相同)。
  • MD5校验和而不是时间戳(构建变得对时间同步失败具有弹性)。
  • 自动且准确的C / C ++标头依赖项。
  • 准确的目录间依赖关系(递归make不提供的东西)。
  • 可移植性(1个构建链来统治它们,不受路径样式问题的影响)。
  • 一种真正的编程语言(优于GNU make)。

答案 6 :(得分:0)

关于创建基本Makefile的一些很好的参考资料

http://en.wikipedia.org/wiki/Make_(software)

http://mrbook.org/tutorials/make/

http://www.opussoftware.com/tutorial/TutMakefile.htm

http://www.hsrl.rutgers.edu/ug/make_help.html

第一对特别是像你所描述的那样具有最小的Makefile。希望有所帮助。

答案 7 :(得分:0)

带有调试选项的SConstruct:

env = Environment()

if ARGUMENTS.get('debug', 0):
    env.Append(CCFLAGS = ' -g')

env.Program( source = "template.cpp" )

答案 8 :(得分:0)

弗罗林有一个很好的起点。我不喜欢gnu autoconf,所以我从那里开始并进一步采用了这个概念并称之为MagicMakefile。我有3个版本,从简单到复杂。最新版本现在是github:https://github.com/jdkoftinoff/magicmake

基本上,它假设您有一个项目源文件的标准布局,并使用通配符函数动态创建makefile规则,然后进行评估,处理头文件依赖,交叉编译,单元测试,安装和包装。

[edit]此时我将cmake用于我的所有项目,因为它为许多构建系统生成了有用的项目文件。

jeff koftinoff

答案 9 :(得分:0)

我正在寻找最小的Makefile看起来不像

some_stuff:
    @echo "Hello World"

我知道我参加这个派对已经迟到了,但我想我也会把帽子扔进戒指。以下是我用过多年的目录项目Makefile。稍加修改后,它会扩展为使用多个目录(例如src,obj,bin,header,test等)。假设所有头文件和源文件都在当前目录中。并且,必须为项目指定一个用于输出二进制名称的名称。

NAME = my_project

FILES = $(shell basename -a $$(ls *.cpp) | sed 's/\.cpp//g')
SRC = $(patsubst %, %.cpp, $(FILES))
OBJ = $(patsubst %, %.o, $(FILES))
HDR = $(patsubst %, -include %.h, $(FILES))
CXX = g++ -Wall

%.o : %.cpp
        $(CXX) $(HDR) -c -o $@ $<

build: $(OBJ)
        $(CXX) -o $(NAME) $(OBJ)

clean:
        rm -vf $(NAME) $(OBJ)

答案 10 :(得分:-1)

如果您的问题是因为autoconf认为.h文件是c文件,请尝试将其重命名为.hpp或.h ++