0

我在 OS X 中编码这是我的 Makefile:

#makefile for stack_5_1
# Yitong Zhou

stack_5 : main.o Stack.o LIFO_Stack.o Peekback_Stack.o
    g++ -o stack_5 main.o Stack.o LIFO_Stack.o Peekback_Stack.o
main.o: main.cpp Stack.h LIFO_Stack.h Peekback_Stack.h
    g++ -c main.cpp
Stack.o: Stack.cpp Stack.h
    g++ -c Stack.cpp
LIFO_Stack.o: LIFO_Stack.cpp LIFO_Stack.h
    g++ -c LIFO_Stack.cpp
Peekback_Stack.o: Peekback_Stack.cpp Peekback_Stack.h
    g++ -c Peekback_Stack.cpp

clean: 
    rm -rf *.o stack_5 

错误:

.....  // very very long 
Dwarf Exception Unwind Info (__eh_frame) in Stack.o
Dwarf Exception Unwind Info (__eh_frame) in LIFO_Stack.o
Dwarf Exception Unwind Info (__eh_frame) in Peekback_Stack.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [stack_5] Error 1

gcc 和 g++ 有什么区别?为什么我用 gcc 替换 g++ 时编译失败?

顺便说一句,我如何确保我的 makefile 可以在 Cygwin、linux、OS X 和其他环境中正确运行。

4

3 回答 3

6

gcc 默认用于编译 C

g++ 默认用于编译 C++

主要区别在于 g++ 透明地添加了选项-x c++(使用 C++)和-lstdc++(使用 C++ 标准库)。

试试这个 Makefile:

stack_5: main.o Stack.o LIFO_Stack.o Peekback_Stack.o

main.o: main.cpp Stack.h LIFO_Stack.h Peekback_Stack.h

Stack.o: Stack.cpp Stack.h

LIFO_Stack.o: LIFO_Stack.cpp LIFO_Stack.h

Peekback_Stack.o: Peekback_Stack.cpp Peekback_Stack.h

make 将根据文件扩展名自动填写合理的规则。

另请查看-MMgcc 选项。它将自动生成正确的 make 依赖项(哪些头文件),因此您无需手动维护此列表。make 手册和 gcc 手册中有更多关于如何使用它的内容。

于 2012-11-19T21:01:57.703 回答
2

gcc作为链接器,IIRC 不会在标准c++库中链接,例如-lstdc++. 不确定是否足以确保所有系统上的一切正常,您可能需要使用 autotools 或类似工具。

于 2012-11-19T21:02:51.113 回答
0

gcc 旨在编译纯 C,而 g++ 接受(兼容)C 和 C++ 代码。

这可能是你错误的原因。

于 2012-11-19T21:03:10.287 回答