25

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

当前目录包含,例如

t.cpp th

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

4

11 回答 11

33

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

make t

它会调用

g++ t.cpp -o t

这甚至不需要目录中的 Makefile,尽管如果你有一个 t.cpp 和一个 tc 和一个 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 $<
于 2008-11-13T15:36:40.277 回答
19

这是我的代码片段目录中的通用生成文件:

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会出现缺少分隔符的错误。

于 2008-11-13T15:52:34.253 回答
7

你看过SCons吗?

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

Program("t.cpp")

然后输入:

scons

完毕!

于 2008-11-13T15:43:06.753 回答
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
于 2008-11-13T15:44:00.370 回答
2

一个相当小的 GNU Makefile,使用预定义的规则和自动依赖:

CC=c++
CXXFLAGS=-g -Wall -Wextra -MMD
LDLIBS=-lm
program: program.o sub.o
clean:
    $(RM) *.o *.d program
-include $(wildcard *.d)
于 2015-01-31T13:04:05.557 回答
1

你看过OMake吗?

OMakeroot

open build/C
DefineCommandVars()
.SUBDIRS: .

生成文件

.DEFAULT: $(CXXProgram test, test)

然后在 Linux 或 Windows 上,只需键入:

omake

作为奖励,您将自动获得:

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

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

http://en.wikipedia.org/wiki/Make_(软件)

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

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

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

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

于 2008-11-13T15:46:46.560 回答
0

带有调试选项的 SConstruct:

env = Environment()

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

env.Program( source = "template.cpp" )
于 2008-11-14T00:53:14.083 回答
0

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

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

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

杰夫·科夫蒂诺夫

于 2008-11-14T08:18:35.823 回答
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)
于 2018-01-27T23:20:03.593 回答
-1

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

于 2008-11-13T15:45:06.530 回答