Mac OS X 上的 GCC 7 找不到 C++ 标准库
Posted
技术标签:
【中文标题】Mac OS X 上的 GCC 7 找不到 C++ 标准库【英文标题】:GCC 7 on Mac OS X doesn't find C++ standard library 【发布时间】:2018-01-06 01:09:30 【问题描述】:我一直在尝试编译以下简单程序:
#include <iostream>
using namespace std;
int main()
std::cout << "Test compilation" << std::endl;
return 0;
我在 Mac OS X 10.11.6 上使用 GGC 7(通过自制软件安装)。
很遗憾,它没有构建这个简单的测试程序(源文件是test.cpp):
$ make test.out
gcc-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.cpp -o test.cpp.out
Undefined symbols for architecture x86_64:
"std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
_main in ccJgvOlx.o
"std::ios_base::Init::Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccJgvOlx.o
"std::ios_base::Init::~Init()", referenced from:
__static_initialization_and_destruction_0(int, int) in ccJgvOlx.o
"std::cout", referenced from:
_main in ccJgvOlx.o
"std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char>>&)", referenced from:
_main in ccJgvOlx.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char>>&, char const*)", referenced from:
_main in ccJgvOlx.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
make: *** [test.out] Error 1
我的 GCC 的配置如下:
$ gcc-7 -v
Using built-in specs.
COLLECT_GCC=gcc-7
COLLECT_LTO_WRAPPER=/usr/local/Cellar/gcc/7.2.0/libexec/gcc/x86_64-apple-darwin15.6.0/7.2.0/lto-wrapper
Target: x86_64-apple-darwin15.6.0
Configured with: ../configure --build=x86_64-apple-darwin15.6.0 --prefix=/usr/local/Cellar/gcc/7.2.0 --libdir=/usr/local/Cellar/gcc/7.2.0/lib/gcc/7 --enable-languages=c,c++,objc,obj-c++,fortran --program-suffix=-7 --with-gmp=/usr/local/opt/gmp --with-mpfr=/usr/local/opt/mpfr --with-mpc=/usr/local/opt/libmpc --with-isl=/usr/local/opt/isl --with-system-zlib --enable-checking=release --with-pkgversion='Homebrew GCC 7.2.0' --with-bugurl=https://github.com/Homebrew/homebrew-core/issues --disable-nls
Thread model: posix
gcc version 7.2.0 (Homebrew GCC 7.2.0)
为了让这个简单的测试程序编译和运行,我需要做些什么改变?
【问题讨论】:
它是否也创建了一个g++-7
程序?我没有 Mac 来测试这个,但我的系统上遇到了类似的问题。
这是 'gcc' 和 'g++' 之间的区别。感谢您的评论。我认为他们应该对这个错误发出警告。
确实,Clang 会根据源文件自动切换为编译 C 或 C++。所以 Mac 上默认的 gcc
命令编译 C++ 程序。 GCC 不是这种情况。
【参考方案1】:
我不是你在尝试用 C 编译器编译 C++ 程序。
根据我的经验,使用g++
应该不会出现这样的问题:
g++-7 -O0 -g -std=c++1z -pedantic -Wall test.cpp.cpp -o test.cpp.out
我建议你改变规则
test.out: test.cpp
$CC $CPPFLAGS ...
到
test.out: test.cpp
$CXX $CPPFLAGS ...
在你的makefile中解决这个问题。
【讨论】:
我知道我希望 GNU Compiler Collection 的主程序能够确定传递链接器的选项,尤其是因为它成功地将 C++ 代码编译为目标文件;唯一失败的步骤是链接。也许如果它仍然代表 GNU C 编译器,我会同意你的第一段。当然,如果它只像一个 C 编译器,但它一直工作到除了编译的最后一步(不幸的是,这也是产生最神秘错误的步骤)。我认为这是 GCC 中的一个临界错误。以上是关于Mac OS X 上的 GCC 7 找不到 C++ 标准库的主要内容,如果未能解决你的问题,请参考以下文章
Mac OS X 上的 MathGL 和 FLTK cmake:找不到符号
导致 cpp(C 预处理器)删除 Mac OS X 上的 C++ 注释
无法在 Mac OS X 上的 Visual Code 中调试 C++