Файлы библиотеки DevIL и зависимости - PullRequest
3 голосов
/ 21 апреля 2011

Хорошо, вот в чем дело. У меня есть все необходимые мне файлы 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 для проекта. В моих "Дополнительные зависимости" у меня есть

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 ==========

Ответы [ 10 ]

4 голосов
/ 29 апреля 2011

Поскольку вы добавили выходные данные сборки, ответ теперь прост: ваши ошибки компоновщика не имеют ничего общего с DevIL.

Вам необходимо установить ссылку на SDL (простой слой DirectMedia).

Поскольку SDL имеет интерфейс C и - IIRC - не требует, чтобы DLL использовала ту же кучу, что и приложение, версия VC8 "Библиотеки разработки" должна подойти (даже если Вы используете VC10). Просто добавьте SDL.lib в «Дополнительные зависимости», и все будет в порядке.


EDIT

OK. Вы либо

  1. нет ссылок на требуемые .lib файлы (DevIL.lib и т. Д.) Или
  2. ссылки на поврежденные / неправильные .lib файлы

По крайней мере, я не могу придумать другого объяснения. Названия, упомянутые в журнале сборки (__imp__ilInit@0 и т. Д.), Верны, и текущий "DevIL SDK" ( DevIL 1.7.8 SDK для 32-разрядной Windows ) отлично работает с 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. Одна из строк должна выглядеть следующим образом: Searching X:\path\to\DevIL.lib: - это путь к копии DevIL.lib, используемой компоновщиком. Если это не тот путь, куда вы скопировали файлы из SDK, который вы скачали, вы обнаружили проблему.

И если нет строк, содержащих DevIL.lib, то компоновщик даже не пытается найти его. Однако я никогда не видел, чтобы #pragma comment потерпел неудачу, поэтому, если вы действительно добавили те строки, которые почти наверняка не могут иметь место.

Кстати: пожалуйста, дайте мне знать, если вам удалось решить эту проблему. Это так странно, что я действительно хочу знать, что происходит :) 1059 *

2 голосов
/ 29 ноября 2011

На тот случай, если у вас никогда не получится, или у кого-то еще возникнет такая же проблема (как у меня): я скачал 64-битную версию DevIL для моего 64-битного компьютера с Windows, но Microsoft Visual Studioиспользовала Express) была 32-битная версия.Я скачал 32-битную версию DevIL, и она сработала!

2 голосов
/ 02 мая 2011

Я заметил, что ваш файл config.h.in должен иметь расширение .win, потому что он находится в пакете DevIL-SDK-x86-1.7.8.zip. И нет файла 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 include - все в одном каталоге с именем IL (по умолчанию 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
  2. ILUT.dll

идет в каталог проекта (... \ Project Folder \ Project1 \ в вашем случае)

Затем я добавил файлы проекта в проект, щелкнув правой кнопкой мыши на проект-> Свойства-> Компоновщик-> Ввод-> Дополнительные зависимости (записал только имена библиотек, например, ILU.lib)

В моем проекте я просто включаю IL \ il.h, IL \ ilu.h и IL \ ilut.h

Я думаю, вы, возможно, ошиблись файлами ...

2 голосов
/ 21 апреля 2011

Вы должны указать компоновщику связываться с библиотеками IL.

Настройки проекта, компоновщик, ввод

Убедитесь, что каталог, в котором находятся библиотеки, также находится в поле Дополнительные каталоги.

1 голос
/ 24 декабря 2014

Я не знаю, если этот вопрос все еще активен, но так как у него нет выбранного ответа, я опубликую это. У меня была такая же проблема с DevIL версии 1.7.8. Чтобы исправить это, я откатил версию до 1.7.7 и использовал #undef _UNICODE, прежде чем включать заголовки, и #define _UNICODE, потом. Проект скомпилирован без ошибок компоновщика и работал безотказно. На 1.7.8 библиотеки кажутся юникодными, или, по крайней мере, они не очень хорошо поддерживают ascii. Тем не менее, это может быть просто странная проблема совместимости с моим компьютером, так как это не является общей проблемой

1 голос
/ 20 сентября 2011

У меня была такая же проблема.В моем случае это была проблема с кодом во всех файлах .h дьявола

#ifdef _WIN32
    #if (defined(IL_USE_PRAGMA_LIBS)) && (!defined(_IL_BUILD_LIBRARY))
        #if defined(_MSC_VER) || defined(__BORLANDC__)
            #pragma comment(lib, "%LIBNAME%.lib")
        #endif
    #endif
#endif

после того, как второй код #if был деактивирован.я добавил #pragma comment(lib, "DevIL.lib") (и еще 2) в свой main.h, и ошибки компоновщика исчезли.

извините за мой плохой английский = [

1 голос
/ 05 мая 2011

вы должны сравнить сигнатуры функций, которые вы видите в своих ошибках, с сигнатурами, которые вы получаете с зависимости от.exe (обходчик зависимостей). Если они различаются, может возникнуть проблема с компилятором. Затем вы можете попытаться скомпилировать с:

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

Ничего не гарантировано, конечно, только предложение.

Вы также можете проверить свойство ' Дополнительные каталоги библиотек ' на странице ' Linker \ General ', чтобы узнать, указывает ли (при использовании) на правильный каталог для вашей сборки (если вы также добавили путь к стандартным lib-каталогам VC, это может привести к конфликту, используйте один, но не оба).

Еще одно предложение - создать новый проект и повторить его снова, возможно, вы совершили очень маленькую ошибку.

Удачи!

1 голос
/ 02 мая 2011

У меня была такая же проблема.Похоже, что предварительно скомпилированные двоичные файлы поменялись местами: я мог бы связать с теми, которые обозначены как не-Unicode, но они совершенно не смогли бы попытаться использовать мои не-Unicode-строки и вернуть Unicode-строки.Попробуйте создать свои собственные двоичные файлы из исходного кода или используйте предыдущую версию.

0 голосов
/ 20 июля 2014

Я сделал именно так, как Сара сказала о 32-битной или 64-битной версии Visual Studio. Я на 64-битном компьютере с 32-битной Visual Studio 2012. Я получил эту ошибку, когда использовал файлы x64 DevIL. Получение версии x86 помогло. Вот основные шаги, которые я предпринял, чтобы убедиться, что он работает:

Щелкните правой кнопкой мыши свой проект и перейдите в Свойства .

Под C / C ++> General , добавьте папку DevIL ' include ' в Дополнительные каталоги включения .

Затем в Linker> General добавьте папку DevIL ' lib ' (она должна содержать: DevIL.lib, ILU.lib и ILUT.lib) в Дополнительная библиотека Справочники . Для x64 он может не содержать папку lib, это может быть просто сам каталог DevIL (для версии 1.7.8 это был тот случай).

Также в Linker> Input добавьте имена этих файлов .lib в Дополнительные зависимости .

Теперь это все, что вам нужно сделать в свойствах проекта. В 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
}
0 голосов
/ 21 апреля 2011

Возможно, вам придется объявить некоторую переменную препроцессора, чтобы фактически сообщить компилятору, что вы импортируете символ;Я имею в виду что-то, связанное с __declspec( dllimport )

...