2017-10-12 17 views
0

我在这里有一个简单的makefile。这是一个最小的C++项目,我希望使用隐式规则来做正确的行为。 与下面的makefile,它会报告错误。然后我输入“make -n”,似乎make使用cc而不是cxx。 但是,当我检查了GNU页面时,它说CXX是一个隐含变量: https://www.gnu.org/software/make/manual/html_node/Implicit-Variables.html如何才能推断出最终目标需要哪种编译器?

所以我可以说最终目标。隐式工具总是cc?

objects = test.o main.o 
CXX=g++ 
CFLAGS=-std=c++11 

test: $(objects) 

.PHONY: clean 
clean: 
    rm -f *.o test 
+2

用于链接的命令在'LD'变量中。您需要将其设置为正确的前端程序(即'g ++')。 –

+0

@Someprogrammerdude thnx的信息。我编辑了我的标题,我认为这有点误导。我的意思是别的。 –

+0

不相关,但您应该尝试使用[CMake](http://www.cmake.org),我觉得它更优雅,使用更简单。 – vsoftco

回答

1

这可能是因为你的目标文件正在与制作的默认链接,这是$(CC)连接。我们可以看到,如果我们的make --print-data-base -f /dev/null输出看 - 特别是:

%: %.o 
# recipe to execute (built-in): 
     $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

如果我们看一下LINK.o定义,我们可以看到:

# default 
LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH) 

幸运的是,Make为我们提供了LINK.cc

# default 
LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) 

所以我们需要做的是重新定义LINK.o是的LINK.cc的价值,并且连接将通过我们的C++编译器来完成:

LINK.o = $(LINK.cc) 

如果我们有几个目标,我们可以使用一个目标因变量来定位效果:

test: LINK.o = $(LINK.cc) 

在Makefile文件的其他评论:

  • test是程序中的可怜的名字 - 很容易错误地运行标准/usr/bin/test
  • 您可能指的是CXXFLAGS=-std=c++11(而不是CFLAGS)。
  • 所有makefile应包含一个.DELETE_ON_ERROR:目标,以便中断的命令不会保留最新显示的部分输出。
+0

Thnx的解释。所以我认为make也可以确定它需要哪个链接器来实现正确的行为,例如C++或c。所以它似乎使用cc的所有.o文件来链接它们?所以这一步我不能使用除c项目之外的隐式变量。 –

+0

Make使用文件名来确定(例如)'%.cpp'→'%.o'需要C++编译器。同样,如果您只有一个源文件,则可将C++源代码直接转换为可执行文件。但是,一旦你有了目标文件,它只有一条链接它们的规则 - 这可能适用于C,Fortran或者Pascal,并且它可以适用于C++(但是只有当你明白用'g ++'链接时最少)标准C++库,并且您手动将必要的标志添加到'LDLIBS')。设置'LINK.o',IMO更容易。 –

相关问题