Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
最低c++;为linux生成文件 我想找到一个简单的推荐的“最小”C++的Mag文件,它将用G++编译和链接一个文件和H文件。理想情况下,make文件中甚至没有物理文件名,只有一个.cpp到.o的转换。生成这样一个makefile而不陷入autoconf的恐怖中的最佳方法是什么_C++_Makefile_Compilation - Fatal编程技术网

最低c++;为linux生成文件 我想找到一个简单的推荐的“最小”C++的Mag文件,它将用G++编译和链接一个文件和H文件。理想情况下,make文件中甚至没有物理文件名,只有一个.cpp到.o的转换。生成这样一个makefile而不陷入autoconf的恐怖中的最佳方法是什么

最低c++;为linux生成文件 我想找到一个简单的推荐的“最小”C++的Mag文件,它将用G++编译和链接一个文件和H文件。理想情况下,make文件中甚至没有物理文件名,只有一个.cpp到.o的转换。生成这样一个makefile而不陷入autoconf的恐怖中的最佳方法是什么,c++,makefile,compilation,C++,Makefile,Compilation,例如,当前目录包含 t、 cpp t、 h 我想为它创建一个makefile。我尝试了autoconf,但它假设.h是gcc而不是g++。是的,虽然我不是一个初学者,但我从多年前开始重新学习项目操作的最佳方法,因此我正在寻找为小型项目创建和维护makefile的自动化方法。如果是单个文件,您可以键入 make t 它将调用 g++ t.cpp -o t 这甚至不需要目录中的Makefile,尽管如果您有一个t.cpp、一个t.c和一个t.java等等,它会变得混乱 也是一个真正的Makefi

例如,当前目录包含

t、 cpp t、 h


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

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

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 $<
SOURCES:=t.cpp
#obj是所有源代码,其中.cpp替换为.o
OBJS:=$(来源:.cpp=.o)
全部:t
#通过使用cflags、lflags和任何libs(如果已定义)以及对象列表调用编译器来编译二进制“t”。
t:$(OBJS)
$(CC)$(CFLAGS)-o t$(OBJS)$(LFLAGS)$(LIBS)
#通过使用cflags和includes(如果已定义)调用编译器,从.cpp获取.o
.cpp.o:
$(CC)$(CFLAGS)$(包括)-c$<
你看过吗

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

Program("t.cpp")
然后键入:

scons

完成了

假设没有预配置的全系统
设置:

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
CXX=g++
CPPFLAGS=#将预处理器设置(-I,-D等)放在此处
CXXFLAGS=-Wall#将编译器设置放在此处
LDFLAGS=#将链接器设置放在此处
测试:test.o
$(CXX)-o$@$(cxflags)$(LDFLAGS)test.o
.cpp.o:
$(CXX)$(CPPFLAGS)$(CXXFLAGS)-c$<
test.cpp:test.h

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

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


特别是前两个示例,它们的makefile与您描述的示例文件非常相似。希望对您有所帮助。

以下是我的代码片段目录中的通用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
将显示缺少分隔符的错误。

s带调试选项的构造:

env = Environment()

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

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

弗洛林有一个很好的起点。我不喜欢gnu autoconf,所以我从那里开始,把这个概念更进一步,称之为MagicMakefile。我有3个版本,从简单到复杂。最新版本现已发布在github上:

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

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

杰夫·科夫蒂诺夫

你看过吗

奥马库特

奥马克档案

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

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

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

一个相当小的GNU生成文件,使用预定义的规则和自动deps:

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

我在四处寻找一个最小的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)
NAME=my\u项目
FILES=$(shell basename-a$$(ls*.cpp)| sed's/\.cpp//g')
SRC=$(patsubst%,%.cpp,$(文件))
OBJ=$(patsubst%,%.o,$(文件))
HDR=$(patsubst%,-include%.h,$(文件))
CXX=g++-Wall
%.o:%.cpp
$(CXX)$(HDR)-c-o$@$<
构建:$(OBJ)
$(CXX)-o$(名称)$(OBJ)
清洁:
rm-vf$(名称)$(OBJ)

这也不会创建任何依赖项。此makefile几乎(但不是完全)等同于“all:t”,并让内置规则接管……但为什么您要为t:?它有点违背了拥有cpp.o规则的意义,t规则通过调用链接器从.o文件生成二进制文件。如果我有四个来源[ABCD] .CPP和一个名为T的二进制,则规则将所有生成的对象链接到一个可执行文件中。对于C++文件,应该使用<代码> CXX < /C>和<代码> CXXFLAGG/<代码>,而不是<代码> cc>代码>和<代码> cFLAGs<代码>。来源:。注意, CppFLAGS < /C>是C预处理器,适用于C和C++。但是维护一个大的项目变得很难正确地完成(你可以很容易地对它进行分类,但是正确地进行分类是很困难的)。使用“像SCON”这样的工具来构建您的文件,使其看起来更漂亮。当然比Autoconf容易。OMake很棒,值得爱
some_stuff:
    @echo "Hello World"
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)