无法识别对 `std::ios_base::Init::Init()' 的引用

102
我编写了这段代码来读取3个文件,其中TM是方阵的大小,LER是数组的行数,并根据最后一个值定义了一个非方形矩阵((ler/2)*2)。
然后...代码读取一个具有一些关系的文件,所有数据都是数字并分配给C [ler]。
接下来...C [ler]被分配给B [ler/2] [2]。
每行中的这些坐标在B [ler/2] [2]中被分配给a和b。
a和b是要在矩阵A [tm] [tm]中添加1的行和列。
我的代码崩溃了,我不知道错误在哪里。
当我尝试编译它时,编译器gcc -g -o MatSim MatSim.cpp提示:
/usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::Init()'
/usr/include/c++/4.6/iostream:75: undefined reference to `std::ios_base::Init::~Init()'
collect2: ld returned 1 exit status

此外,当我尝试编译它时,编译器f77 -o MatSim MatSim.cpp提示:

/tmp/cc6ewlkf.o: In function `__static_initialization_and_destruction_0(int, int)':
MatSim.cpp:(.text+0x17ad4a): undefined reference to `std::ios_base::Init::Init()'
MatSim.cpp:(.text+0x17ad4f): undefined reference to `std::ios_base::Init::~Init()'
collect2: ld returned 1 exit status

解决方法

主要问题是一个库的问题,使用以下命令编译你的代码:

 g++ -g -o MatSim MatSim.cpp -lstdc

还是不起作用?安装库:

sudo apt-get install g++-multilib

编译器是否报错?你确定说“编译器给出1的退出状态”而不是程序给出1的退出状态时是正确的吗? - Celeritas
Celeritas,是的,这就是我在执行任何编译器 [gcc o f77] 后收到的信息。 - Another.Chemist
可能是在Unix上找不到C++库的问题的重复。 - Jonathan Leffler
谢谢Jonathan Leffler!!!你和Reinier让我的代码豁然开朗,现在我真的可以向前迈进了!!! - Another.Chemist
3个回答

209
您可以通过以下几种方式解决这个问题:
  • 使用g++替代gccg++ -g -o MatSim MatSim.cpp
  • 添加-lstdc++gcc -g -o MatSim MatSim.cpp -lstdc++
  • <string.h> 替换为 <string>

这是一个链接器的问题,不是编译器的问题。同样的问题在问题iostream linker error中也有涉及,它解释了发生了什么。


谢谢Reiner...我尝试了你的建议,但是我得到了以下信息:_g++ -g -o MatSim MatSim.cpp -lstdc/usr/bin/ld: 找不到-lstdccollect2: ld 返回 1 退出状态 - Another.Chemist
1
如果你选择使用额外的库选项,那么你应该使用-lstdc++而不是-lstdc。但如果你使用g++,则不需要添加该库。 - Reinier Torenbeek
谢谢Reinier!!!你和Jonathan Leffler让我的代码豁然开朗,现在我真的可以向前迈进了!!! - Another.Chemist
2
我认为这是人为错误:使用gcc(而不是g++)编译c++代码是不正确的(就像我自己做错了,然后在这里搜索了一下 :))。 - Zac
我尝试使用ndk-build到jni目录。我认为你的答案只适用于一个.cpp文件,而不是整个目录。你有解决方案吗? - CleanCoder

7

大多数链接器错误是由于缺少库文件导致的。

我在我的项目->目标->构建阶段->链接二进制文件时加入了libstdc++.6.dylib

这个方法适用于我使用的Xcode 6.3.2版本和iOS 8.3操作系统。

祝好!


谢谢你分享这个,伙计。你刚刚解决了我的问题。我正在尝试使用gtest-1.7.0框架和Xcode 6.3.2版本为我的项目编译一个用于Unity测试的目标。 - Eduardo Reis

2

g++相当于gcc -xc++ -lstdc++ -shared-libgcc

在使用sizeof()方法时,我遇到了类似的错误。通过在gcc中使用g++或更高版本的标签,代码得以编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接