我希望找到一个简单的推荐用于linux的“minimal”c ++ makefile,它将使用g ++编译和链接单个文件和h文件。理想情况下,make文件甚至不会包含物理文件名,只有.cpp到.o转换。生成这样一个makefile的最佳方法是什么,而不会陷入autoconf的恐怖?
当前目录包含,例如
t.cpp t.h
我想要创建一个makefile。我试过autoconf,但它假设.h是gcc而不是g ++。是的,虽然不是初学者,但我从几年前开始重新学习项目操作的最佳方法,因此我正在寻找自动化的方法来为小项目创建和维护makefile。
答案 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)
答案 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
作为奖励,您自动获得:
答案 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)
基本上,它假设您有一个项目源文件的标准布局,并使用通配符函数动态创建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 ++