20

我有一些旧的 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

4

3 回答 3

34

Cstring.h头文件和 C++string头文件不可互换。

总的来说,你的问题是文件被正确编译,但错误的运行时库被链接进来。

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

于 2008-11-05T01:07:39.213 回答
3

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

所以可能使用您的 C++ 编译器而不是 ld 进行链接。

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

于 2008-11-05T01:06:17.763 回答
2

当我尝试用 Cygwin (g++) 编译时,我得到了同样的错误。

只需添加-L/usr/local/bin -L/usr/lib编译规则,它应该可以工作。

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

于 2015-12-07T09:58:16.483 回答