c++ - g++ 失败,标准 C++ 库出现 "undefined reference"错误

标签 c++ linux gcc

我已经构建并安装了 g++,并在一个简单的“Hello World”程序上对其进行了测试,它似乎可以工作。

但是,对于我们较大的代码,编译会失败并出现以下错误:

CMakeFiles/gaim_convert.dir/GaimConvert.cpp.o: In function `Output(std::string const&, std::ostream&)':GaimConvert.cpp:(.text._Z6OutputRKSsRSo[_Z6OutputRKSsRSo]+0x12): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& st d::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long)'

正确运行的程序是:

#include <iostream>

int main() {
  std::cout << "Hello World!" << std::endl;
  std::cin.get();
  return 0;
}

很明显,C++ 标准库的某些部分已正确安装。这不仅仅是没有安装 libstdc++ 的“明显”安装错误。

代码将使用不同版本的编译器进行编译,因此它不是代码。

有什么方法可以调试安装以消除此错误消息?库路径为LD_LIBRARY_PATH:

/tec/mannucci/gccBuild/lib64:/tec/mannucci/gccBuild/lib:/usr/local/gmp510/lib:/usr/local/mpfr311/lib:/usr/local/mpc101/lib:/usr/local/ppl011/lib:/usr/local/cloog0162/lib:/usr/local/lib64:/usr/lib64:...

感谢用户评论,我查看了链接命令,显然有问题。这可能是 cmake 问题。这是链接命令:

/tec/mannucci/gccBuild/bin/g++ -fmessage-length=0 -O3 -DNDEBUG CMakeFiles/gaim_convert.dir/GaimConvert.cpp.o -o gaim_convert -L/usr/lib/gcc/x86_64-redhat-linux/4.1.2 -rdynamic ../../lib/geometry/libgeometry.a ../../lib/util/libutil.a ../../ctimetrans/libtimetrans.a ../../libversion.a

请注意“-L”链接到旧版本的 gcc。接下来的问题是如何告诉 cmake 库在哪里。我不知道该怎么做。这就是使用 LD_LIBRARY_PATH 的意义所在。我认为这可以解决这个问题。

在相关说明中,令我有些不安的是,cmake 没有找到 $path 中的 g++ 编译器,而是恢复到/usr/bin/c++。然后,我必须编辑 CMakeCache.txt 文件以使其使用实际上位于路径上的 g++,而不是/usr/bin/c++。

最佳答案

我们能够按如下方式解决此问题:

1) 定义环境变量CC (=gcc) 和CCX (=g++) 来指向我们正在使用的gcc 编译器。 cmake 使用这些环境变量来查找 c 和 c++ 编译器。

2) 设置LD_LIBRARY_PATH为gcc和g++编译器对应库支持的路径。

3) 确保路径上有正确的编译器。

在我们这样做之前,cmake 将无法正确配置并且编译将失败。

这些步骤似乎适用于在非标准位置构建的编译器。

关于c++ - g++ 失败,标准 C++ 库出现 "undefined reference"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31099605/

相关文章:

c++ - 无法用常量变量初始化数组...为什么?

c++ - 写 long long 时出现段错误

c - 未定义对 `SHA1' 的引用

c - 使用 GCC "-Wextra"选项编译时如何初始化 C 结构而不产生警告?

c++ - 将 char 作为参数传递

c++ - 从管道 block 和死锁中读取

C fscanf 让我重复行

linux - 在 Linux 中使用 Photoshop CS3 的最佳方式

python - 在 Python 中更新存储的信息

c - LD_PRELOAD 不适用于我的程序