このVC ++ 6.0リンカーエラーを解決する方法
-
11-07-2019 - |
質問
これは、前の男が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
を使用していませんが、 'netで何も見つかりません。おそらく私がリンクしているいくつかのライブラリで使用されていますが、どのライブラリにあるのかわかりません。
--- Alistair。
解決 2
申し訳ありませんが、これは内部の問題であることが判明しました。 4年前のマーベリックコーダーとさびたノーナッシング(私!)の組み合わせ。
コードは _socket_noblock
を使用しませんが、使用は socket_noblock
を使用し、独自のライブラリの1つにリンクするだけです。
他のヒント
LNK4098は問題ではない可能性があります。たとえば、静的ランタイムリンケージを使用し、LIBCMT(" D"サフィックスがないことに注意)がデフォルトライブラリに追加されるライブラリのリリースバージョンに対してリンクすると発生する可能性があります。デバッグ構成でビルドされているアプリケーションは、LIBCMT D を使用するため、競合が発生します。そのライブラリとランタイムに依存するものを交換しない限り、実際には安全かもしれません。
_socket_noblock
の場合、検索ユーティリティ(grepやfindなど)を使用して、.objおよび.libファイルでこの文字列を検索できます。これにより、どのライブラリがシンボルを参照しているかがわかります。これは、そのライブラリが持っている依存関係を発見するための出発点になる可能性があります。
" Dependency Walker" -アプリケーションの依存関係を見つける無料ツール、アプリケーションがlibcmtdにリンクしている方法を把握します。 編集:もちろん、リンクに失敗する新しいバージョン(コメントを参照)では使用できませんが、古いバージョン、または新しいバージョンの既知のライブラリで使用できますとリンクします。
ただし、実際の問題は私が提案したものとは無関係であるため、おそらく質問を終了する必要があります。
CRTの異なるバージョンにリンクしているように見えます-おそらく、古いコンパイラを新しいコンパイラとCRTのバージョンと共に使用しているためです。
defaultlib" LIBCMTD"他のライブラリの使用と競合するは、プログラムが1つ以上のライブラリとは異なるバージョンのランタイムライブラリを使用していることを示す警告です。 警告をなくすために、プログラムとライブラリ全体で同じランタイムを使用します。
(プロジェクト設定) (C ++タブ) カテゴリ(コード生成) (ランタイムライブラリを使用)