2

これは、前任者が 4 年前に構築し、インストールして実行している Windows コンソール アプリケーション (実際にはサービス) です。いくつかの変更を加える必要がありますが、現在のバージョンをビルドすることさえできません! ビルド出力は次のとおりです。

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

使用する/NODEFAULTLIBと、大量のエラーが発生します。コードは実際には使用されていません_socket_noblockが、ネット上で何も見つかりません。おそらく、リンクしているライブラリで使用されていると思われますが、どのライブラリにあるのかわかりません。

--- アリステア。

4

4 に答える 4

3

LNK4098 は問題ないかもしれません。たとえば、静的ランタイム リンケージを使用し、LIBCMT ("D" サフィックスがないことに注意してください) をデフォルト ライブラリに追加するライブラリのリリース バージョンに対してリンクすると、この問題が発生する可能性があります。デバッグ構成で構築されているアプリケーションは LIBCMT Dを使用するため、競合が発生します。そのライブラリとランタイムに依存するものを交換していなければ、実際には安全かもしれません。

に関しては_socket_noblock、何らかの検索ユーティリティ (grep や find など) を使用して、.obj および .lib ファイルでこの文字列を検索できます。このようにして、どのライブラリがシンボルを参照しているかがわかります。これは、そのライブラリが持つ依存関係を発見するための出発点になる可能性があります。

于 2008-12-01T11:08:35.337 に答える
1

" Dependency Walker" (アプリケーションの依存関係を見つけるための無料ツール) を使用して、アプリケーションが libcmtd にどのようにリンクしているかを把握できます。 編集:もちろん、リンクに失敗した新しいバージョンでは使用できませんが(コメントを参照)、古いバージョン、または新しいバージョンがリンクする既知のライブラリで使用できます。

ただし、実際の問題は私が提案したものとは無関係であるため、おそらく質問は終了する必要があります.

CRT の異なるバージョンにリンクしているようです。おそらく、古いビルド ライブラリを新しいコンパイラと CRT のバージョンと共に使用しているためです。

于 2008-12-01T11:00:14.307 に答える
1

申し訳ありませんが、これは内部の問題であることが判明しました。4 年前の異端者のコーダーと今のさびた何もない (私!) の組み合わせ。

コードは使用していません_socket_noblock、使用しており、独自のライブラリの 1 つにリンクする必要があります。socket_noblock

于 2008-12-01T11:05:30.460 に答える
0

defaultlib "LIBCMTD" conflicts with use of other libsは、プログラムが 1 つ以上のライブラリとは異なるバージョンのランタイム ライブラリを使用していることを示す警告です。プログラムとライブラリ全体で同じランタイムを使用して、警告をなくします。

(プロジェクト設定) (c++ タブ) カテゴリ (コード生成) (ランタイム ライブラリを使用)

于 2010-03-12T13:25:25.427 に答える