6

小さな問題があります。C++ コードがあり、いくつかのライブラリにリンクしています。私は以前にソースコードから(元の)exeを持っていて、それは最初のマシンで完全に動作します。2 番目のマシンでは、ソース コードの作業や変更などを行います。2 番目のマシンでは、そのソース コードのビルドが正常に機能し、second.exe をコピーして最初のマシンで実行しようとすると、問題が発生します。エラーメッセージが表示されます

「プロシージャ エントリ ポイント _ZNSt8_detail15_List_node_base7_M_hookEPS0_ がダイナミック リンク ライブラリ libstdc++-6.dll に見つかりませんでした。」

まず、second.exe は original.exe と同じフォルダにコピーされるため、元の dll は original.exe と同じフォルダにあるため、ddl が表示されるはずです。これは MinGW でコンパイルされ、NetBeans とプロジェクト プロパティで動作し、(ライブラリ ファイルの追加を介して) ライブラリが追加されますが、libstdc++-6.dll はそこに追加されません。libstdc++-6.dll は、original.exe があるフォルダーにあります。

どうも

4

1 に答える 1

9

XP内でMingWを使用すると、非常によく似た問題が発生しました。

mingW を使用して 12 klines の C++ プロジェクトをコンパイルしました。MSYS 内では正常に動作しますが、ネイティブ コマンド シェル内で呼び出すと失敗し、libstdc++-6.dll 内にエントリ ポイント Z_St8_detail15_and_so_on がないと主張します。

逆に、次の単純なプログラムは MSYS と cmd の両方で実行されました。

#include <iostream>

using namespace std ;

class Hello {
  public:
  Hello() { cout << "Hello !" << endl ; }
} ;

Hello hello ;

int main (void) {}

libstdc++ (gcc -o hello hello.cpp -lstdc++) に対してコンパイルする必要があり、-lstdc++ を省略した場合はもちろんコンパイルに失敗しました。そのため、名前のマングリングだけが問題ではなかったようです。

エクスプローラーで libstdc++-6.dll を検索したところ、システムに 2 つあることがわかりました。1 つは migw32 内にインストールされ、もう 1 つは独自のバージョンの lib を保持するプログラムによって以前にインストールされていました。そのディレクトリ内。しかし、そのlibが最初に見つかるようにPATHを変更していました!

現在のシェル内の PATH の先頭に Mingw が立っていたパスを挿入しました。次のようなものです:

set PATH=C:\mingw\bin;D:\msys\1.0\local\bin;%PATH%

そして今、すべてが正常に動作します!


マーティン、あなたのコメントを書き込めないので、メッセージを編集します。Windows がどのように DLL を検索するかについては、ここで説明されています。

http://msdn.microsoft.com/en-en/library/7d83bc18%28v=vs.80%29.aspx

乾杯

于 2012-11-21T16:49:32.970 に答える