iostream 链接器错误

问题描述 投票:0回答:3

我有一些旧的 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
3个回答
37
投票

C

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

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

Dev-C++ 使用 GCC。 GCC 可以根据文件扩展名正确确定文件中的语言,但不会链接正确的运行时库,除非您特别要求它(在命令行中

-lstdc++
)。将 GCC 称为“
g++
”(或者,在您的情况下,“
mingwin32-g++
”)也将获得正确的语言,并将链接所需的库。


4
投票

您需要链接到您的 C++ 运行时。这取决于您的平台和编译器,但将

-lc
添加到链接器命令中可能会做到这一点。

因此可能会使用您的 C++ 编译器而不是

ld
进行链接。

无论如何,如果您希望 C++ 代码正常工作,您可能必须使用 C++ 编译器而不是

ld
进行链接——通常需要异常和静态初始化程序才能正常工作...


2
投票

尝试使用 Cygwin 进行编译时,我遇到了同样的错误 (

g++
)。

-L/usr/local/bin -L/usr/lib
添加到编译命令应该可以工作。

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

© www.soinside.com 2019 - 2024. All rights reserved.