7

いくつかの静的ライブラリ (コンパイル時に静的にリンクされた *.lib ファイル) を使用する VC++ コード (VS2008 を使用してビルド) があります。

理解しやすいように、EXE コードを「AAA.EXE」と呼び、lib ファイルを「A.lib」、b.lib などと呼びます...

AAA.EXE コードと静的ライブラリ コードの両方が、VS2008 を使用して構築されています。

「AAA.EXE」が 32 ビット バージョンで正常に動作し、AAA.EXE が 64 ビット モードでビルドされている場合、以下のリンカ エラーが表示されます。

もちろん、スタティック ライブラリを 64 ビット モードで再構築し、次のように AAA.EXE に lib パスを指定しました::「AAA.EXE に対応するプロジェクト構成プロパティ -> リンカー -> 一般/入力」。

このリンカ エラーは、長い間私を悩ませてきました。どんな助けでも大歓迎です。

Logger.lib(Loggerr.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CWTTLogger::CWTTLogger(void)" (__imp_??0CWTTLogger@@QAE@XZ)    

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CWTTLogger::~CWTTLogger(void)" (__imp_??1CWTTLogger@@UAE@XZ)    

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionA(unsigned short *,long *)" (__imp_?FunctionA@CWTTLogger@@QAEJPAGPAJ@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionB(unsigned short *,long)" (__imp_?FunctionB@CWTTLogger@@QAEJPAGJ@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionC(unsigned short *,unsigned long,unsigned short *,long)" (__imp_?FunctionC@CWTTLogger@@QAEJPAGK0J@Z)     

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __cdecl CWTTLogger::FunctionD(unsigned long,long,...)" (__imp_?FunctionD@CWTTLogger@@QAAJKJZZ)             

1>Logger.lib(Logger.obj) : error LNK2001: unresolved external symbol "__declspec(dllimport) public: long __thiscall CWTTLogger::FunctionE(unsigned short *,long)" (__imp_?FunctionE@CWTTLogger@@QAEJPAGJ@Z)         


1>C:\Users\User1\Documents\XYZ\Code\64bit\aaa.exe: fatal error LNK1120: 7 unresolved externals

また、追加するには::

AAA.exe コードを 32 ビットから 64 ビットにするために、設定で 2 つの変更を行いました:: 1)64 ビット ビルド

2) 構成プロパティ ページの各プロジェクトの 64 ビット ビルド

もちろん、コードは 32 ビットと 64 ビットの両方に対応しています。VC2008 でのこれら 2 つの設定変更は、32 ビット AAA.exe コードを 64 ビット ビルドにするために完了していますか?

別のstackoverflowリンクを見ると、「プロジェクト構成プロパティ->リンカー->詳細->ターゲットマシンはデフォルトで「設定されていません」にもう1つ設定されていることがわかります。ターゲットマシン==「MACHINEx64」にすると、私が以前に得ていた別の種類のエラー::

「致命的なエラー LNK1112: モジュール マシン タイプ 'X86' がターゲット マシン タイプ 'x64' と競合しています」

リンカーオプションの「ターゲットマシン」フィールドを「未設定」または「MACHINEx64」に設定する必要があるかどうかについて、私は本当に明確にしていませんか?

「はい」の場合は、問題を解決する方法を見つける必要があります。

4

4 に答える 4

5

見た目からすると、プロジェクトの半分だけを に変更しx64、残りは のままにしていWin32ます。プロジェクトの依存関係を表示しないため、それが問題であるかどうかを推測するのは困難です...いずれにせよ、コンパイルを成功させるには、すべての依存プロジェクト (ライブラリ) を x64 に切り替える必要があります!

于 2013-08-26T06:42:23.933 に答える
4

その致命的なエラー LNK1112 は、64 ビットの実行可能ファイルを作成しようとしたときに、実際に 32 ビット モードで何かをリンクしていることを示しています。

画像 2) は、64 ビット モードのすべてのプロジェクトではなく、一部のプロジェクトのみを示しています。これはトラブルのようですね!

おそらく、問題は LIB ディレクトリにありますか? 通常、私のプロジェクト (ここでは VS2010) は次の点で異なります。

Project Properties -> VC++ Directories -> Library Directories

ターゲットアーキテクチャに応じて、lib32またはディレクトリを指します。lib64

于 2013-08-26T06:42:46.113 に答える
2

古いスレッド、私は知っていますが、それを機能させるには、「明示的な」エクスポートを DEF ファイルに追加する必要があることがわかりました。32ビットは暗黙的に追加していたに違いありませんが、64ビットはそうではありませんでした. これが誰かを助けることを願っています:)

于 2016-10-20T14:03:23.477 に答える
1

問題が何であるかを理解したと思います。

AAA.EXE は、Logger.lib スタティック ライブラリを使用しており、これが WTTLog.DLL の関数を呼び出していました。そして、このMicrosoft DLL「WTTLog.DLL」は32ビットDLLです。

これが、64 ビットの AAA.EXE で機能しなかった理由です。

したがって、このスレッドで提起した質問に対する答え、つまり 64 ビット アプリケーションで 64 ビット ライブラリをリンクする方法を見つけました。しかし、これでもう 1 つ疑問が残ります。

「64 ビット バージョンの WTTLog.lib と WTTLog.DLL の "wttlogger.h" はどこにありますか。このために、新しいスレッドを作成しました。これは、問題が今とは異なるためです。

WTTLog.DLL の 64 ビット バージョンの WTTLog.lib および wttlogger.h ヘッダー ファイルを取得する方法

于 2013-08-27T07:52:57.760 に答える