Проблемы с установкой/связыванием библиотеки загрузки модели Assimp

Я пытаюсь установить Assimp для использования в своих проектах, но у меня возникли проблемы. В настоящее время я использую Win 10 Pro и Visual Studio 15 2017.

  1. Я загрузил Assimp 4.0.1.zip, распаковал его в каталог, загрузил cmakeGui и дважды запустил конфигурацию, а затем сгенерировал в каталог Assimp/build.

  2. Затем я зашел в Assimp/build, запустил Assimp.sln и выбрал ALL_BUILD, как мне кажется. Затем я скопировал все файлы в /code/debug, которые были рядом с .lib и .dll, и переместил их все в каталог Debug моего проекта, где создан мой exe. Я скопировал .lib в свой каталог opengl/libs и все заголовки в /include из исходно извлеченной загрузки в мой каталог opengl/includes/assimp.

  3. Наконец, я изменил настройки компоновщика своих проектов, чтобы включить assimp.lib и assimp.dll (псевдоним для простоты этого поста).

Когда я попытался собрать проект, он сказал, что не может открыть dll, и во время эксперимента я скопировал dll в каталог проекта вместе с main.cpp и другими моими файлами и снова запустил, на этот раз он сказал: «Недействительный или поврежденный файл: невозможно прочитать по адресу 0x378"


Можно с уверенностью сказать, что мне нужно изучить компиляцию, компоновку и cmake, но пока я начал сначала.

Я думал, что у меня это работает (и, может быть, так и есть...) после того, как я перестал жаловаться, когда включал заголовки в свой проект. Для этого я начал с нуля, собрал Assimp так же, как и раньше, переместил все файлы с dll в каталог libs, выгрузил все включения из загрузки в мои включения, а также переместил config.h из сборки в этот каталог. Затем я установил настройки компоновщика в проекте и ничего не перемещал в каталоги моего проекта.

После этого он перестал жаловаться, поэтому я продолжил серию руководств, которым следовал. Я скомпилировал, получил кучу ошибок, исправил их до 0, а потом вдруг получил 8 новых вместо них.

Код серьезности Описание Состояние подавления строки файла проекта Ошибка LNK2019 неразрешенный внешний символ _aiGetMaterialTextureCount, указанный в функции "public: unsigned int __thiscall aiMaterial::GetTextureCount(enum aiTextureType)const" (?GetTextureCount@aiMaterial@@QBEIW4aiTextureType@@@Z) opengl_model_loading F:\ Рабочий стол\MyDocuments\Tuts\opengl\начало работы\opengl_model_loading\opengl_model_loading\main.obj 1

Эта ошибка дала мне ощущение, что это, вероятно, связано с dll. Пожалуйста, порекомендуйте.


person eternalNoob    schedule 28.08.2017    source источник


Ответы (1)


Я только недавно сделал это сам и скажу, что у меня было много проблем с v401, а также с ошибками или проблемами с связыванием. Успешно заставил мою работать со следующим;

Примечание. У ASSIMP есть зависимость boost.

  1. Загрузите/клонируйте мастер-библиотеку Asset-Importer-Lib с github: https://github.com/assimp/assimp
  2. Откройте графический интерфейс Cmake и после открытия:

    • Where is the Source code: "..\MyDocuments\assimp\assimp-master"
    • Где собирать бинарники: "..\MyDocuments\assimp\assimp-master\build". Вам нужно будет создать папку сборки и указать на нее Cmake.

    2.1. В качестве альтернативы, если вы знакомы с параметром командной строки: создайте файлы проекта с соответствующими путями, используя

    • cmake -G"Visual Studio 14 Win64"
  3. Нажмите настроить.
  4. Затем сгенерируйте. Убедитесь, что вы выбрали правильный вариант сборки, например VS15 2017 64bit.
  5. Загрузите "..\MyDocuments\assimp\assimp-master\build\Assimp.sln" с помощью Visual Studio.
  6. Щелкните правой кнопкой мыши «ALL_BUILD» и выберите «Сборка». Это займет несколько минут. После этого и без ошибок он должен создать необходимые *.dll/*.lib в ..\MyDocuments\assimp\assimp-master\build\code\Debug
  7. Свяжите и включите в свой существующий проект соответствующий файл *.lib, а также папку "..\MyDocuments\assimp\assimp-master\include\assimp". Вам также необходимо убедиться, что файл *.dll находится в той же папке или включен, что и *exe, который вы запускаете.
  8. Вам также может понадобиться скопировать из ..\MyDocuments\assimp\assimp-master\build\include\assimp\config.h" и включить его на шаге 7.

Просто убедитесь, что вы создаете правильные библиотеки для своего кода, т.е. 32/64bit/debug/release/unicode/etc, в противном случае могут возникнуть проблемы.

Следующее видео полезно для визуально склонных. https://youtu.be/W_Ey_YPUjMk

Надеюсь это поможет.

РЕДАКТИРОВАТЬ: Если вам нужна версия статической библиотеки, т.е. не требуется .dll: Из приведенных выше шагов:

5.1. Измените соответствующий тип и расширение конфигурации проекта с .dll на .lib (должно быть два: assimp и zlib).

5.2. Щелкните правой кнопкой мыши «UpdateAssimpLibsDebugSymbolsAndDLLs» -> «Свойства» -> «События сборки» и обновите пути в разделах командной строки с ..\Path*.dll на ..\Path*.lib. (Если возникнут ошибки, сделайте то же самое в проекте assimp_cmd).

  1. То же, что и выше, но теперь также необходимо связать ваш проект с IrrXML.lib и zlibd.lib. Больше не нужен файл *.dll.
person ReturnVoid    schedule 09.10.2017
comment
Рад, что у вас тоже все заработало, мне удалось заставить его работать некоторое время назад, и я забыл обновить это. Я сделал новую установку всего и убедился, что платформа подходит, выполнил в основном те же шаги, что и в моем вопросе, и убедился, что правильно свяжу все это и поместил .dll рядом со сборкой .exe из моего проекта. - person eternalNoob; 10.10.2017
comment
Да, иногда помогает начать заново. Только что заработала версия статической библиотеки, т.е. не требуется .dll. Обновлю пост с подробностями. - person ReturnVoid; 10.10.2017
comment
Спасибо за это пошаговое руководство! Для статической библиотеки мне также пришлось включить ASSIMP_BUILD_ZLIB и отключить BUILD_SHARED_LIBS в CMake. Файлы IrrXML.lib и zlibstaticd.lib (вместо zlibd.lib) располагались в ...\build\contrib\irrXML\Debug и ...\build\contrib\zlib\Debug соответственно. - person JD80121; 05.10.2018
comment
Имя конфигурации в моем проекте (например, x86 или x64) должно быть таким же, как и в Assimp. Одной только внутренней настройки (32 или 64 бита) недостаточно. Нарушить это может вызвать LNK2019. - person cppBeginner; 25.11.2020