1

C コンパイラに渡された間違った定義でコンパイルされたサードパーティの静的ライブラリに実行可能ファイルをリンクしています。同じライブラリは DLL としても利用でき、静的バージョンはすべてのシンボルがエクスポートされるようにコンパイルされています。もちろん、これは静的ライブラリには意味がありません。エクスポートは、そのようなライブラリが統合される実行可能ファイル (または DLL) に伝播するためです。

実行可能ファイルをこのライブラリにリンクすると、ライブラリのシンボルが実行可能ファイルからエクスポートされます。生成された .lib および .exp ファイルについては気にしません。実行可能ファイル自体でエクスポートされたシンボルを削除する必要があります。

私が必要としているのは、次のいずれかの方法です。

  1. リンカーのエクスポートされたシンボルのリストを強制的にクリアするか、または

  2. ライブラリから抽出されたオブジェクト ファイルを編集して、シンボルを「アンエクスポート」します。

プロジェクトのビルドには Visual Studio 2012 を使用しています。ライブラリは .LIB ファイルとして提供されており、ライブラリアンを使用してオブジェクト ファイルを抽出し、ダンプビンを使用して、エクスポートされたシンボルの存在を確認できます。

現時点では、ベンダーに修理を依頼したくありません。というか、私が年を取る前にベンダーが回答してくれるとは思っていません。

4

1 に答える 1

1

リンク中に作成された PE イメージ (.exe または .dll) からエクスポートされたシンボルを完全にオーバーライドするには、.expファイルとリンクする必要があります。ファイルにリンクする.defだけでは、エクスポートされたリストにシンボルを追加できるだけで、リストから削除することはできません

  1. ファイルを作成し.defます。何もエクスポートしたくない場合は、ほとんど空になります。

    NAME "YourExecutableBaseName"
    

    これはYourExecutableBaseName.exeまたはYourExecutableBaseName.dllです。のベース名は.def、リンカの出力ファイル名と一致する必要があります。一致しないと、警告が表示されます。

  2. を使用し.expてファイルからファイルを作成します。.defLIB

  3. 実行可能ファイルをこの.expファイルにリンクします。このエクスポート ファイルは、エクスポートされたすべてのシンボルを完全に定義し、リンカはそこにないものをエクスポートしません。

于 2013-09-27T13:12:25.500 に答える