从g++;叮当作响++;在makefile中

从g++;叮当作响++;在makefile中,makefile,g++,clang++,Makefile,G++,Clang++,我有以下生成文件: all: xmltest xmltest: xmltest.cpp tinyxml2.cpp tinyxml2.h 这工作正常-在执行后,生成所有可执行文件“xmltest” 但是,我想将编译器切换到clang++。因此,我在文件的开头添加了这一行: CXX=clang++ 现在执行make all会产生一个错误: clang++ xmltest.cpp tinyxml2.cpp tinyxml2.h -o xmltest clang++.exe: warni

我有以下生成文件:

all: xmltest
xmltest: xmltest.cpp tinyxml2.cpp tinyxml2.h
这工作正常-在执行
后,生成所有可执行文件“xmltest”

但是,我想将编译器切换到clang++。因此,我在文件的开头添加了这一行:

CXX=clang++
现在执行
make all
会产生一个错误:

clang++     xmltest.cpp tinyxml2.cpp tinyxml2.h   -o xmltest
clang++.exe: warning: treating 'c-header' input as 'c++-header' when in C++ mode, this behavior is deprecated
clang++.exe: error: cannot specify -o when generating multiple output files
<builtin>: recipe for target 'xmltest' failed
make: *** [xmltest] Error 1
clang++xmltest.cpp tinyxml2.cpp tinyxml2.h-o xmltest
警告:将C++标题作为“C++头”处理时,在C++模式下,此行为被禁止。
clang++.exe:错误:生成多个输出文件时无法指定-o
:目标“xmltest”的配方失败
make:**[xmltest]错误1

如何通过对原始make文件进行最小修改来解决此问题?

您不应将头文件列为翻译单元(这些是CPP)

您通常应设置.h先决条件:

xmltest.cpp: tinyxml2.h
tinyxml2.cpp: tinyxml2.h
并编译/链接翻译单元:

all: xmltest

xmltest: xmltest.cpp tinyxml2.cpp
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

IIRC您/可能/也可以使用

xmltest: xmltest.cpp tinyxml2.cpp      |  tinyxml2.h
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

但我现在无法检查这一点,您不妨编写一个shell脚本:在解决方案中使用makefile没有任何好处。无论何时更改任何文件,整个过程都将重建,因此您不妨运行:

clang++ -g -o xmltest xmltest.cpp tinyxml2.cpp
无论何时更改任何内容并跳过makefile

如果您想要一个利用make某些功能的makefile,可以这样编写:

CXX = clang++
all: xmltest
xmltest: xmltest.o tinyxml2.o
xmltest.o tinyxml2.o: tinyxml2.h

现在您有了一些有用的东西,其中只有需要根据您所更改的内容重建的文件才会重建。如果你的程序变得更复杂,你可以使用更多的make工具来保持它的可管理性。

没有那一行,然后用那一行运行什么确切的命令?@EtanReisner我在中更新了
make
的输出question@EtanReisner它解决了这个问题。你的评论是什么…:)