9

これは、少なくとも 2 つの密接に関連しているが異なる質問のシリーズの一部です。別々に尋ねることで、正しいことをしていると思います。

Visual C++ 2008 アプリを C ランタイム ライブラリなしで動作させようとしています。これは、MFC やその他の凝ったものを使用せず、単純な Windows API だけの Win32 GUI アプリです。

そこで、Project Properties -> Configuration -> C/C++ -> Advanced -> Omit Default Library Names を Yes (コンパイラ フラグ/Zl) に設定し、再ビルドしました。私の他の質問の主題である適切なエントリポイント関数を書いたとしましょう。

2 つのリンカー エラーが発生します。それらはおそらく関連しています。リンカは、未解決の外部シンボル__fltused_memcpyinについて文句を言いfoobar.objます。言うまでもなく、私は自分のプログラムでどちらも明示的に使用していませんが、memcpyどこかで使用していますfoobar.cpp。(私は使用していたでしょうが、それはd と同一であるCopyMemoryことが判明しました...)#definememcpy

memcpy(のようなコンパイラ組み込み関数を使用することで問題を解決できると思って#pragma intrinsic(memcpy)いましたが、違いはありません。)

プリプロセッサの出力 (コンパイラのコマンド ラインに追加) を見ると、またはin/Pへの参照が見当たりません。__fltused_memcpyfoobar.i

ですから、私の質問は、これらのリンカー エラーはどこから来て、どのように解決すればよいのでしょうか?

4

2 に答える 2

15

__fltusedフロートまたはダブルを使用しているか、少なくとも宣言していることを意味します。コンパイラはこの「役に立たない」シンボルを挿入して、フローティングサポート.objをcrtからロードします。これを回避するには、名前の付いたシンボルを宣言するだけです。

#ifdef __cplusplus
extern "C" {
#endif
int _fltused=0; // it should be a single underscore since the double one is the mangled name
#ifdef __cplusplus
}
#endif

WRT _memcpy-memcpyは__cdecl関数であり、すべてのcdecl関数は装飾の一部として自動的に_を取得します。したがって、「__ cdecl memcpy」と言うと、コンパイラとリンカは「_memcpy」というシンボルを探しに行きます。組み込み関数は、明示的に要求された場合でも、ビルド設定に組み込み関数と矛盾するデバッグ設定がある場合はインポートできます。したがって、いずれにせよ、ある時点で独自のmemcpyおよび関連する関数を実装する必要があります。

于 2009-10-17T21:10:42.703 に答える
1

foob​​ar.cppの「アセンブリリストの生成」(またはそのような)コンパイラオプションを一度設定してから、アセンブラコードを調べることをお勧めします。これにより、これらの記号が使用されている場所がわかります。

于 2009-10-17T21:08:33.697 に答える