2011-09-15 9 views
0

質問の延長としてMSVC unresolved external symbol linking executablesAが含まれ、2つのメンバ関数FおよびGを持つクラスPがあり、グローバルP MyPも含まれています。私は関数MyP.Fを実行ファイルTから呼び出しようとしています。私はついにリンク部分を過ぎましたが、今は実行時に例外を伴って失敗します。静的ライブラリ呼び出しのアクセス違反

A.cpp

struct P { 
    void F(); 
    void G(); 
} MyP; 

P::F() { 
} 
P::G() { 
} 
int main() { 
    MyP.F(); 
    MyP.G(); 
} 

T.cpp

struct P { 
    void F(); 
    void G(); 
} MyP; 

int main() { 
    MyP.F(); 
    MyP.G(); 
} 

私はそれは、Visual Studio 2008でFを呼び出す行でTにブレークポイントを置くことができますが、私はボタンを押したときにステップインまたはステップオーバーすると、例外First-chance exception at 0xfe5ca589 in A.exe: 0xC0000005: Access reading location 0xfe5ca589が発生します。私は、コールスタックを見ると、それは以下の
[フレームが不正確および/または不足しているかもしれ

fe5ca589()
A.EXE!G()+ 0x60a6バイトを示し、何の記号はAのロードされていませんexeファイル]

どちらのプロジェクトは、同じVisual Studioのソリューションの一部であり、そしてAが正しくTのための依存性として設定され、かつ正確にリンクしているようだが、私はそれにステップすることはできません。誰も洞察力を持ってVisual StudioにAのシンボルをロードさせるので、私はそれにステップインしてエラーを見つけることができますか? (何かがおかしい、エラーの原因とリンクされている場合か?)

+0

http://stackoverflow.com/questions/6283482/c-cli-use-loadlibrary-getprocaddress-with-an-exe –

答えて

1

実行可能ファイルは、メタデータがそれらを別のアドレスにロードできるようにする必要はありませんし、A.EXEがその所望のアドレスにT.EXEにロードすることはできません、T.EXEの理由コードは既にそこにあります。

デフォルトのロードアドレスを A.EXE(ビルド時はリンカーオプション)に変更することで回避できますが、正しい解決策はDLLを使用することです。 は(確認、no you can't.EXEファイルから

輸出は、プラグインのDLLは、メインアプリケーション内の関数を呼び出すことができるようにするために提供されています。彼らはDLLのように.EXEのロードを許可するつもりはありません。

+0

Aw、それは良くありません。私は仕事でこの1ヶ月のようにこれに取り組んできました。だから、私の上司には、私が思ったほど簡単にはできないことを説明しなければならず、 'T'をリンクする静的ライブラリとして' A_alt'プロジェクトを追加する必要があります。 –

+0

Windowsのリンカーは、これが問題であることに気付かなかったでしょうか?悪いMicrosoft。 –

+0

@Mooing:詳細については、[移転]の[このPE形式の説明](http://msdn.microsoft.com/en-us/library/ms809762.aspx)を検索してください。リンカが強制的に再配置データを「A.EXE」で発行するか、「T.EXE」のロードアドレスを変更して「A.EXE」を修正する必要はありませんが、間違いなくデフォルトでは動作しません。 –

関連する問題