2

基本的に、数か月前は機能していたので修正するように言われた一連のコードを継承しましたが、現在は機能していません。プログラム自体はリンクエラーでいっぱいのようで、私はそれらのいくつかを修正することができました. ただし、メインで使用されている一部の関数が解決されていないLNK2019 unresolved external _imp エラーに遭遇しました。 _imp」が原因で、.dll または .lib ファイルからのインポートに関連する問題であると想定しています。

まず、VS2010 に正しくインポートされていると思われる 3 つの .lib ファイルがあり、プラットフォームを 64x に構成しました。.lib ファイルに対応する .dll ファイルもあります。これらのエラーが発生した関数の宣言を含む .h ファイルには、次のようなものが含まれています

ILAPI void ILAPIENTRY ilDeleteImage(const ILuint Num);

残念ながら、私は自分で書いていない.dllファイルで定義が定義されていると推測しているので、確信が持てません。しかし、これは以前は機能していたコードであるため、def/decl が一致しない理由ではなく、リンカが定義を見つけることができないため、このエラーが発生していると思います。

ILAPI にカーソルを合わせると、「ILAPI __declspec(dllimport)」と表示されます。私の現在の推測では、プログラムは .lib ファイルをインポートし、.lib ファイルは .dll ファイルを使用して関数の定義を取得します。コンパイラが特定の .lib ファイルを見つけることができないと私に言い続けなくなったので、.lib ファイルをインポートしていると思います。ただし、.dll ファイルに接続していない可能性があるのではないかと心配しています。私は何か確信が持てません。.lib ファイルを開きました。.lib ファイルには、エラーを引き起こしている関数の名前が含まれています。また、Dependency Walker プログラムを使用して DLL ファイルを調べたところ、次のエラーのいくつかが表示されました。

エラー: 暗黙的に依存するモジュールにエクスポート関数がないため、少なくとも 1 つのモジュールに未解決のインポートがあります。

エラー: CPU タイプが異なるモジュールが見つかりました。

他の人のコメントに基づいて、2番目のエラーを無視できるように感じます。しかし、最初のエラーはわかりません。それが問題の根本的な原因であるかどうかもわかりません。そうかもしれないし、そうでないかもしれない。

VS cmd と依存関係ウォーカーを使用して .lib ファイルの内部も調べましたが、見つからない関数の名前が .lib と .dll のいずれかにリストされているようです。

構成に関しては、リリース モード x64 プラットフォームで実行しています。proj -> prop -> linker -> commandline に "DevIL.lib ILU.lib ILUT.lib " ライブラリ関数を追加しました。リンカーのパスも追加しました->一般->追加のライブラリディレクトリ。入力の追加の依存関係をいじってみましたが、効果はありません。.lib ファイルと .dll ファイルも同じディレクトリに配置されます。proj プロパティの構成では、どこにも .dll について言及していません (そうすべきでしょうか? さまざまな場所で試してみましたが、さらに多くのエラーが発生するだけです) リンク 2019 エラーに関する投稿がたくさんあることは理解していますが、うまくいきませんでした私の特定の問題を探して、これまでのところ運が良かったです。なぜこれが起こっているのかについての手がかりを見つけることができる提案、コメント、またはリンクをいただければ幸いです

ログからのリンカーコマンドは次のとおりです。

ビルド ログ自体からのリンカー コマンドは次のとおりです。

リンク: C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:PROMPT /OUT:"x64\Release\dff.exe" /VERBOSE /INCREMENTAL /NOLOGO /LIBPATH: C:\Users\Sub2\Desktop\dff\x64\Release /MANIFEST /ManifestFile:"x64\Release\dff.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG / PDB:"C:\Users\Sub2\Desktop\dff\x64\Release\dff.pdb" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"x64\Release\ dff.lib" /MACHINE:X64 x64\Release\dff.exe.embed.manifest.res x64\Release\acquisition.obj x64\Release\azmemutil.obj x64\Release\dff.obj x64\Release\fft.obj x64 \Release\FocusMeasure.obj x64\Release\ge.obj x64\Release\stdafx.obj DevIL.lib ILU.lib ILUT.lib 1>LINK: 警告 LNK4075: '/OPT:ICF' 仕様のため '/INCREMENTAL' を無視します

    // This is from Win32's <wingdi.h> and <winnt.h>
    #if defined(__LCC__)
        #define ILAPI __stdcall
    #elif defined(_WIN32) //changed 20031221 to fix bug 840421
        #ifdef IL_STATIC_LIB
            #define ILAPI
        #else
            #ifdef _IL_BUILD_LIBRARY
                #define ILAPI __declspec(dllexport)
            #else
                #define ILAPI __declspec(dllimport)
            #endif
        #endif
    #elif __APPLE__
        #define ILAPI extern
    #else
        #define ILAPI
    #endif

また:

    #define ILAPIENTRY __stdcall 

エラーに近づいたときにログ情報を構築します。

           Found KERNEL32_NULL_THUNK_DATA
             Referenced in kernel32.lib(KERNEL32.dll)
             Loaded kernel32.lib(KERNEL32.dll)
         Searching C:\Users\Sub2\Desktop\dff\x64\Release\DevIL.lib:
         Searching C:\Users\Sub2\Desktop\dff\x64\Release\ILU.lib:
         Searching C:\Users\Sub2\Desktop\dff\x64\Release\ILUT.lib:
         Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\MSVCRT.lib:
         Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\OLDNAMES.lib:
         Searching C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\amd64\msvcprt.lib:

     Finished searching libraries

     Finished pass 1


     Invoking CVTRES.EXE:
      /machine:amd64
      /verbose
      /out:"C:\Users\Sub2\AppData\Local\Temp\lnk92ED.tmp"
      /readonly
      "x64\Release\dff.exe.embed.manifest.res"
     Microsoft (R) Windows Resource To Object Converter Version 10.00.30319.01
     Copyright (C) Microsoft Corporation.  All rights reserved.

     adding resource. type:MANIFEST, name:1, language:0x0409, flags:0x30, size:2
 1>dff.obj : error LNK2019: unresolved external symbol __imp_iluGetImageInfo referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_iluImageParameter referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilDeleteImages referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilSaveImage referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_iluFlipImage referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_iluScale referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilTexImage referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilCopyPixels referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGetError referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilLoadImage referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilBindImage referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGenImages referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilInit referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilGetInteger referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilEnable referenced in function main
 1>dff.obj : error LNK2019: unresolved external symbol __imp_ilOriginFunc referenced in function main
 1>x64\Release\dff.exe : fatal error LNK1120: 16 unresolved externals
 1>Done Building Project "C:\Users\Sub2\Desktop\dff\dff.vcxproj" (rebuild target(s)) -- FAILED.

ビルドに失敗しました。

念のため #define _IL_BUILD_LIBRARY も書いてみましたが、効果はありません。

4

2 に答える 2

0

外部スタティック ライブラリ、QDBM、および PCRE を使用してプロジェクトをビルドしているときに、次のコンパイル エラーが発生しました。

_main.obj : error LNK2001: unresolved external symbol __imp__dpversion
_main.obj : error LNK2001: unresolved external symbol __imp__regcomp

これらの外部プロジェクトを正しく構成して静的ライブラリを構築しましたが、静的リンクを有効にするために、これらのライブラリを使用する独自のコードで正しいプリプロセッサ定義を定義するのを忘れていました。

そのため、QDBM と PCRE からヘッダーをインポートしたときに、__declspec(dllimport)(静的リンクのために) そこにあってはならない を追加したため、存在しない DLL からシンボルをインポートしようとしていました。

不足しているプリプロセッサ定義をビルド システムに追加したところ、エラーが修正されました。

-DQDBM_STATIC -DPCRE_STATIC

CMakeLists.txtこれは、ファイルに次の行を追加することを意味しました。

# Tell QDBM not to build itself as a DLL, because we want to link statically to it.
target_compile_definitions(qdbm PUBLIC -DQDBM_STATIC)
target_compile_definitions(lib_common PUBLIC -DPCRE_STATIC)
于 2015-12-09T21:10:54.177 に答える