Mac OS X 10.11.6上GCC 7编译C++程序找不到标准库的解决方法
解决Mac上GCC编译C++程序的链接错误问题
这是典型的用C编译器处理C++代码导致的链接问题,我帮你梳理下解决办法:
问题根源
你用的gcc-7是GNU的C语言编译器,虽然它能解析C语法完成编译阶段,但在链接环节,它只会默认链接C标准库,不会自动链接C标准库(比如libstdc++)。而std::cout、std::endl这些都是C++标准库的符号,自然会出现"Undefined symbols"的错误。另外你命令里还有个小笔误:把源文件名写成了test.cpp.cpp,输出名写成test.cpp.out,也需要修正。
解决方案
1. 直接修改编译命令
把编译命令里的gcc-7换成专门用于C++的g++-7,同时修正文件名错误:
g++-7 -O0 -g -std=c++1z -pedantic -Wall -Wextra -Wno-unused-variable -Wno-sign-compare -Wno-missing-braces -Wmissing-field-initializers -Werror=implicit test.cpp -o test.out
g++-7会自动帮你链接C++标准库,直接解决符号缺失的问题。
2. 修正Makefile(如果使用Make构建)
如果你是通过Makefile执行构建,要确保使用C++编译器变量CXX而不是C编译器的CC,把Makefile改成这样:
# 指定C++编译器为g++-7 CXX = g++-7 # 你的编译参数 CXXFLAGS = -O0 -g -std=c++1z -pedantic -Wall -Wextra -Wno-unused-variable -Wno-sign-compare -Wno-missing-braces -Wmissing-field-initializers -Werror=implicit # 构建规则 test.out: test.cpp $(CXX) $(CXXFLAGS) $< -o $@
之后执行make test.out就会正确调用C++编译器完成编译链接。
验证
编译成功后,运行生成的可执行文件:
./test.out
你会看到输出:Test compilation,说明程序正常运行。
内容的提问来源于stack exchange,提问作者shuhalo
相关产品推荐
相关产品推荐

