【问题标题】:iostream linker erroriostream 链接器错误
【发布时间】:2010-09-20 19:31:39
【问题描述】:

我有一些旧的 C 代码,我想与一些 C++ 代码结合使用。

以前的C代码有以下内容:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include "mysql.h"

现在我正在尝试让它像这样使用 C++ 和 iostream:

#include <windows.h>
#include <stdio.h>
#include <string>
#include <iostream>
#include "mysql.h"

但我在编译时不断收到以下链接器错误:

[链接器错误] 对 `std::string::size() const' 的未定义引用

[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用

[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用

[链接器错误] 对 `std::string::operator[](unsigned int) const' 的未定义引用

[链接器错误] 对 `std::ios_base::Init::Init()' 的未定义引用

[链接器错误] 对 `std::ios_base::Init::~Init()' 的未定义引用

ld 返回 1 个退出状态

我该如何解决这个问题?

编辑:我的编译器是 Dev-C++ 4.9.9.2

【问题讨论】:

    标签: c++ c linker iostream


    【解决方案1】:

    C string.h 标头和 C++ string 标头不可互换。

    不过,总体而言,您的问题是文件已正确编译,但链接到了错误的运行时库。

    Dev-C++ 使用 GCC。 GCC 可以根据文件扩展名正确确定文件中的语言,但不会链接正确的运行时库,除非您特别要求它(命令行中的 -lstdc++)。将 GCC 称为“g++”(或者,在您的情况下,“mingwin32-g++”)也将获得正确的语言并链接所需的库。

    【讨论】:

      【解决方案2】:

      您需要链接到您的 C++ 运行时。这取决于您的平台和编译器,但是将 -lC 添加到您的链接线可能会做到这一点。

      因此可能会使用 C++ 编译器而不是 ld 进行链接。

      无论如何,如果您希望 C++ 代码正常工作,您可能必须使用 C++ 编译器而不是 ld 进行链接——通常需要异常和静态初始化程序才能正常工作...

      【讨论】:

      • 不会 -lc 链接到 libc 这是一个 C 运行时库,而不是 C++?对于 C++,需要与 C++ 标准库 libstdc++ 链接,使用 -lstdc++ 参数到 gcc(或仅使用 g++ 自动执行此操作)。如果您不知道如何提供帮助,请不要尝试提供帮助,因为您同样可能会做恶作剧。
      • 我指定了 -lC,它是某些 unix 上的 C++ 运行时,而不是 -lc。我的第二段还指出,OP 可以使用 C++ 编译器进行链接,这将为平台提供正确的库和设置。
      【解决方案3】:

      我在尝试使用 Cygwin (g++) 进行编译时遇到了同样的错误。

      只需在编译规则中添加-L/usr/local/bin -L/usr/lib 即可。

      这可能是 Cygwin 特有的,但它也可能有助于解决您的问题。

      【讨论】:

      • 有这个问题,这个修复在 cygwin 中有效。非常感谢!注意 - 我只需要添加 -L/usr/lib 因为 /usr/local/bin 对我来说是空的。虽然我可能仍然建议使用两者,因为它不会伤害
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-16
      • 1970-01-01
      • 2011-03-16
      • 2015-08-04
      • 2012-08-12
      • 2012-06-30
      相关资源
      最近更新 更多