Mac下编译GTest最小示例出现链接错误,寻求解决办法
问题原因与解决方案
从错误信息里的std::__1::basic_string符号可以直接定位问题:你的GTest静态库和当前使用的GCC编译器依赖的C++标准库不兼容。
为什么会出现这个问题?
Mac系统默认的编译器是Clang,它使用libc++作为C++标准库,这个库的STL符号都会带上__1的命名空间前缀(比如std::__1::string);而你用的Homebrew GCC 4.9默认依赖的是libstdc++,它的STL符号是不带这个前缀的标准std::string。
如果你的GTest是通过Homebrew默认安装的,它大概率是用Clang编译的(依赖libc++),现在你用GCC(依赖libstdc++)去链接这个库,自然会出现符号不匹配的未定义错误。
两种可行的解决办法:
办法1:改用Clang编译你的测试代码
既然GTest是用Clang编译的,直接用系统的clang++来编译你的测试文件就行,命令替换成:
clang++ Test.cpp -lgtest -lgtest_main -pthread
这个方法最简单,不需要重新编译GTest。
办法2:用GCC重新编译GTest库
如果你一定要用GCC 4.9来编译测试代码,那就需要重新编译GTest,让它依赖libstdc++:
- 先卸载原来通过Homebrew安装的GTest:
brew remove gtest - 下载对应版本的GTest源码,进入源码目录后执行:
编译完成后,再用你原来的命令编译测试代码,就能正常链接了。mkdir build && cd build # 指定用你的GCC 4.9来编译,强制使用libstdc++ cmake .. -DCMAKE_C_COMPILER=gcc-4.9 -DCMAKE_CXX_COMPILER=g++-4.9 -DCMAKE_CXX_FLAGS="-stdlib=libstdc++" make sudo make install
额外提示
如果不确定当前g++命令指向的是哪个编译器,可以执行g++ --version确认。Homebrew安装的GCC通常会带有版本后缀,比如g++-4.9,你也可以直接用这个全称来编译,避免混淆。
内容的提问来源于stack exchange,提问作者ShanZhengYang
相关产品推荐
相关产品推荐

