20

C++ コードと結合したい古い C コードがいくつかあります。

以前の C コードには、次のインクルードが含まれていました。

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

今、私は次のように iostream で C++ を使用しようとしています:

#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 を追加するとうまくいくかもしれません。

そのため、ld ではなく C++ コンパイラを使用してリンクする場合があります。

いずれにしても、C++ コードを正しく動作させたい場合は、ld ではなく C++ コンパイラを使用してリンクする必要があります。例外や静的初期化子が正しく動作するためには、多くの場合必要です...

于 2008-11-05T01:06:17.763 に答える