在makefile中从g ++切换到clang ++

时间:2015-01-23 12:59:42

标签: makefile g++ clang++

我已经关注了makefile:

all: xmltest
xmltest: xmltest.cpp tinyxml2.cpp tinyxml2.h

这很好 - 在执行make all可执行文件' 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

如何通过最小修改修复原始make文件?

2 个答案:

答案 0 :(得分:2)

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

您通常应该制作.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)

但我现在无法检查

答案 1 :(得分:2)

您也可以编写一个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工具来保持其可管理性。