3

さて、これが問題です。必要なすべてのILファイルがあります。つまり、

DevIL.dll
DevIL.lib

ILU.dll
ILU.lib

ILUT.dll
ILUT.lib

config.h
config.h.in
devil_cpp_wrapper.h
devil_internal_exports.h
il.h
ilu.h
ilu_region.h
ilut.h
ilut_config.h

私のプロジェクト ディレクトリは次のようになります。たとえば、プロジェクトの名前を「Project1」とします。

                 |-Debug---Project1.pdb
                 |
                 |            |---Debug---[loads of files]
                 |            |
                 |            |---Glut---[OpenGL files]
                 |            |
                 |            |---IL---[all the files mentioned above]
                 |-Project1---|
                 |            |---image.bmp
Project Folder---|            |
                 |            |---[header and .cpp files I made in the project]
                 |            |
                 |            |---[files produced by Visual Studio]
                 |          
                 |-ipch---[unrelated stuff]
                 |
                 |-Project1.sln
                 |
                 |-[other files VS created]

前述のように、すべての DevIL ファイルを IL フォルダーに配置しました。プロジェクトに Unicode 文字セットを使用しているため、それらの Unicode 互換バージョンを使用していると確信しています。私の「追加の依存関係」には

ilut.lib; ilu.lib; DevIL.lib;

したがって、依存関係があります。それが問題ではないことはわかっています。

LNK2019:unresolved external symbol__imp_結局のところ、主にすべての IL 関数に対して、まだリンカー エラーが発生しています。

私は何が欠けていますか?プロジェクトのプロパティまたはファイル自体に何か関係があるように思えます...ファイルを見逃したのでしょうか?

編集:出力メッセージは次のとおりです

1>------ Build started: Project: Final Year Project, Configuration: Debug Win32 ------
1>Build started 29/4/2011 12:46:04 pm.
1>InitializeBuildStatus:
1>  Touching "Debug\Final Year Project.unsuccessfulbuild".
1>ClCompile:
1>  Main.cpp
1>c:\users\xxxx\desktop\final year project 0.2\final year project\main.cpp(152): warning C4390: ';' : empty controlled statement found; is this the intent?
1>c:\users\xxxx\desktop\final year project 0.2\final year project\main.cpp(141): warning C4101: 'alpha' : unreferenced local variable
1>ManifestResourceCompile:
1>  All outputs are up-to-date.
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilInit@0 referenced in function "public: static void __cdecl Main::Init(int,char * *)" (?Init@Main@@SAXHPAPAD@Z)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilDeleteImages@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGetData@0 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilConvertImage@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGetInteger@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilLoadImage@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilBindImage@4 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>Main.obj : error LNK2019: unresolved external symbol __imp__ilGenImages@8 referenced in function "public: static void __cdecl Main::DisplayScene(void)" (?DisplayScene@Main@@SAXXZ)
1>C:\Users\xxxx\Desktop\Final Year Project 0.2\Debug\Final Year Project.exe : fatal error LNK1120: 8 unresolved externals
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:01.93
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
4

10 に答える 10

4

ビルド出力を追加したので、答えは簡単です。リンカーエラーはDevILとはまったく関係ありません。

SDL(Simple DirectMedia Layer)にリンクする必要があります。

SDLにはCインターフェイスがあり、-IIRC-はDLLがアプリケーションと同じヒープを使用する必要がないため、「開発ライブラリ」のVC8バージョンは正常に機能するはずです(VC10を使用している場合でも)。「追加の依存関係」に追加するだけSDL.libで問題ありません。


編集

わかった。あなたはどちらかです

  1. 必要な.libファイル(DevIL.libなど)に対してリンクしていない、または
  2. 破損した/間違った.libファイルに対するリンク

少なくとも、私が考えることができる他の説明はありません。ビルドログ(など)に記載されている名前__imp__ilInit@0は正しく、現在の「DevIL SDK」(32ビットWindows用のDevIL 1.7.8 SDK)はVC10で正常に動作します(検証したばかりです)。

DevIL.libなどに対してリンクしていることを確認するには、main.cppファイルに次のように入力してください。

#pragma comment(lib, "DevIL.lib")
#pragma comment(lib, "ILU.lib")
#pragma comment(lib, "ILUT.lib")

これらのファイルの正しいバージョンに対してリンクしていることを確認するには、SDK全体を再ダウンロードして、新しいファイルで再試行してください。


編集2

報酬の半分を受け取ったので、もっと役立つはずだと思います:)

最後に試すことができるのは、詳細なリンカー出力を有効にして、リンカーが正しいバージョンのを検出したかどうかを確認することですDevIL.lib。(何も見つからなかった場合はDevIL.lib、エラーが発生LNK1104: cannot open file 'DevIL.lib'します。そのメッセージが表示されないため、問題になることはありません。)

詳細なリンカー出力を有効にするには、/VERBOSEスイッチを追加します([構成設定]->[リンカー]->[コマンドライン]->[追加オプション]の下)。

それはあなたにたくさんのメッセージを与えるでしょう。それらをお気に入りのエディターにコピーし、を含む行を検索しますDevIL.lib。行の1つを読み取る必要があります-これは、リンカーSearching X:\path\to\DevIL.lib:のコピーが使用しているパスです。DevIL.libダウンロードしたSDKからファイルをコピーしたパスではない場合は、問題が見つかりました。

また、を含む行がない場合DevIL.lib、リンカーはそれを見つけようとさえしていません。しかし、私は#pragma comment失敗を見たことがないので、あなたが実際にそれらの行を追加した場合、ほぼ確実にそうではありません。

ところで:あなたがこれを解決することができたなら私に知らせてください。これはとても奇妙なので、私は本当に何が起こっているのか知りたいです:)

于 2011-04-28T21:24:05.130 に答える
2

リンカにILライブラリに対してリンクするように指示する必要があります。

プロジェクト設定、リンカー、入力

ライブラリが含まれているディレクトリが[追加ディレクトリ]フィールドにもあることを確認してください。

于 2011-04-21T12:12:18.903 に答える
2

DevIL-SDK-x86-1.7.8.zip パッケージに含まれているため、config.h.in ファイルには .win 拡張子が必要であることに気付きました。また、devil_cpp_wrapper.h ファイルもありません。

最後に、私はこの方法でこれを解決しました:

  1. ヘッダファイル
    • config.h
    • config.h.win
    • Devil_internal_exports.h
    • il.h
    • il_wrap.h
    • ilu.h
    • ilu_region.h
    • ilut.h
    • ilut_config.h

VC インクルード ディレクトリに移動します - すべて IL という名前の 1 つのディレクトリにあります (デフォルトでは c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\IL\)

  1. ライブラリ ファイル
    • DevIL.lib
    • ILU.lib
    • ILUT.lib

lib ディレクトリに移動します (デフォルトでは c:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\lib\)

  1. DLL ファイル
    • DevIL.dll
    • ILU.dll
    • ILUT.dll

プロジェクトディレクトリに移動します(あなたの場合は...\ Project Folder\Project1\)

次に、プロジェクト->プロパティ->リンカー->入力->追加の依存関係を右クリックして、ライブラリファイルをプロジェクトに追加しました(ILU.libのようなライブラリの名前だけを書きました)

私のプロジェクトでは、IL\il.h、IL\ilu.h、および IL\ilut.h を含めるだけです。

途中で間違ったファイルを取得した可能性があると思います...

于 2011-05-02T16:02:06.463 に答える
2

これがうまくいかなかった場合、または他の誰かが同じ問題を抱えている場合 (私がしたように) に備えて: 私は 64 ビット Windows コンピューター用に 64 ビット バージョンの DevIL をダウンロードしましたが、Microsoft Visual Studio (私は Express を使用していました) ) は 32 ビット版でした。DevIL の 32 ビット バージョンをダウンロードしたところ、動作しました。

于 2011-11-29T00:00:53.800 に答える
1

エラーに表示される関数シグネチャを、depends.exe (depedency walker) で取得したシグネチャと比較する必要があります。それらが異なる場合、コンパイラの問題がある可能性があります。次に、次のようにコンパイルしてみてください。

extern "C" {
 // put your devils-include directives here ...
}

もちろん、保証されるものは何もありません。単なる提案です。

また、' Linker\General ' ページの ' Additional Library Directories ' プロパティをチェックして、(使用時に) ビルドの正しいディレクトリを指しているかどうかを確認することもできます (標準の VC lib-directories へのパスも追加した場合)。競合する可能性があります。両方ではなくどちらかを使用してください)。

もう 1 つの提案は、新しいプロジェクトを作成して最初からやり直すことです。

幸運を !

于 2011-05-04T22:47:23.920 に答える
1

私も同じ問題を抱えていました。ビルド済みのバイナリが交換されているようです。非ユニコードとして指定されたものにリンクできますが、非ユニコード文字列を使用してユニコード文字列を返そうとすると、完全に失敗します。ソースから独自のバイナリをビルドするか、以前のバージョンを使用してみてください。

于 2011-05-02T10:24:01.947 に答える
0

サラが 32 ビット版または 64 ビット版の Visual Studio バージョンについて言ったこととまったく同じことをしました。32 ビットの Visual Studio 2012 を実行している 64 ビットのコンピューターを使用しています。x64 DevIL ファイルを使用したときに、このエラーが発生しました。x86 バージョンの入手が役に立ちました。確実に実行するために行った基本的な手順は次のとおりです。

プロジェクトを右クリックし、[プロパティ] に移動します。

C/C++ > Generalの下で、DevIL の ' include ' フォルダーをAdditional Include Directoriesの下に追加します。

次に、Linker > Generalの下で、DevIL の「lib」フォルダー (DevIL.lib、ILU.lib、および ILUT.lib を含む必要があります) を追加のライブラリー ディレクトリに追加します。x64 の場合、lib フォルダが含まれていない可能性があり、DevIL ディレクトリ自体である可能性があります (バージョン 1.7.8 の場合はそうでした)。

また、[Linker] > [Input ] で、これらの .lib ファイル名を[ Additional Dependencies ] に追加します。

これで、プロジェクトのプロパティで行う必要があるのはこれだけです。main.cpp には、適切なヘッダー ファイルを含める必要があり、初期化時に機能するはずです。

例:

#include "IL/il.h"
#include "IL/ilu.h"
#include "IL/ilut.h"

int main(){
   ilInit();
   iluInit();
   ilutRenderer(ILUT_OPENGL); //these are just to initialize
}
于 2014-07-19T22:56:58.413 に答える
0

シンボルをインポートしていることを実際にコンパイラーに伝えるために、何らかのプリプロセッサー変数を宣言する必要があるかもしれません。私は何かに関連することを意味します__declspec( dllimport )

于 2011-04-21T13:33:04.160 に答える