为什么我的makefile调用gcc虽然我设置了CC = g ++?

时间:2017-05-23 17:25:10

标签: c++ c gcc makefile g++

我有一个小代码,可以完美地编译g++ -std=c++17 -Wall -Og -g -o main *.cc。现在我想要有一个makefile,到目前为止我得到了这个:

CC = g++
CFLAGS = -Wall -std=c++17 -Og -g
DEPS = random_tools.h
OBJ = main.o random_tools.o

%.o: %.c $(DEPS)
    $(CC) $(CFLAGS) -o $@ $<

main: $(OBJ)
    gcc $(CFLAGS) -o $@ $^

然而,当我运行make时,它会崩溃,告诉我

g++    -c -o main.o main.cc
g++    -c -o random_tools.o random_tools.cc
gcc -Wall -o main main.o random_tools.o
main.o: In function `main':
main.cc:(.text+0x1d): undefined reference to `std::cout'
main.cc:(.text+0x22): undefined reference to `std::ostream::operator<<(int)'
main.cc:(.text+0x27): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)'
main.cc:(.text+0x2f): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
main.o: In function `__static_initialization_and_destruction_0(int, int)':
main.cc:(.text+0x5d): undefined reference to `std::ios_base::Init::Init()'
main.cc:(.text+0x6c): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
make: *** [makefile:10: main] Error 1

我真正不知道的是它使用gcc代替g++的原因 - 我告诉它使用g++。有人可以了解这里发生的事情以及如何让make做我说的话吗?感谢。

2 个答案:

答案 0 :(得分:5)

此规则

main: $(OBJ)
    gcc $(CFLAGS) -o $@ $^

有&#34; gcc&#34;硬连线到它。将其更改为$(CC),它将按预期运行。

那就是说,这样写Makefile会更好:

CXX = g++
CXXFLAGS = -Wall -std=c++17 -Og -g
DEPS = random_tools.h
OBJ = main.o random_tools.o

# Default goal
main: $(OBJ)
    $(LINK.cc) $^ -o $@ $(LDLIBS)

# Header dependencies
$(OBJ): $(DEPS)

这使用内置的Make约定,因此以后扩展会更容易。 (我没有足够的空间来解释所有内置的Make约定。我建议你阅读GNU Make manual封面。)

(请注意,如果您实际命名了源文件main.crandom_tools.c而不是main.cc和{{1},那么会执行您所期望的操作但是你应该使用random_tools.cc来获取C ++源文件。)

答案 1 :(得分:3)

您正在Makefile的main部分使用gcc命令(第9行)。您应该将其替换为:$(CC) $(CFLAGS) -o $@ $^