Как связать опус с проектом вашей визуальной студии?
Я хотел поиграть с Opus Some, поэтому я скачал Opus 1.1, но мне кажется, что я не могу связать его с моим проектом Visual Studio 2010 Express. Я попытался добавить путь opus1.1/include к каталогу properties/vC++Directoris/include, но компоновщик все еще жалуется на некоторые функции
error LNK2019: unresolved external symbol _opus_decoder_create referenced in function ...
error LNK2019: unresolved external symbol _opus_decoder_destroy referenced in function...
error LNK2019: unresolved external symbol _opus_encoder_destroy referenced in function...
error LNK2019: unresolved external symbol _opus_encoder_ctl referenced in function...
error LNK2019: unresolved external symbol _opus_encode referenced in function...
error LNK2019: unresolved external symbol _opus_decode referenced in function...
Любая помощь будет оценена!
3 ответа
В opus1.1/win32 есть файл.sln, откройте его в Visual Studio 2010 и скомпилируйте для отладки и выпуска, затем он создаст файлы.lib
Причина в том, что дистрибутив opusfile для "Windows" скомпилирован с mingw64 и генерирует библиотеки ссылок.a, а также традиционные файлы.dll. Таким образом, не существует простого способа связать opusfile с Visual Studio.
Это означает, что, как поставляется, вы можете использовать mingw64 только для связи с дистрибутивом "Windows", который, если вы спросите меня, не оказывает большинству разработчиков на базе Windows никаких преимуществ.
"./configure && make" - это то, как вы создали программное обеспечение в стиле UNIX, и требует большого набора инструментов поддержки обработки текста (automake, autoconf, оболочка типа Bourne и т. д.), а также, как правило, GCC, а не Платформа родной компилятор на Windows.
Правильный ответ - генерировать.lib-файлы, либо самостоятельно портируя весь код в дистрибутиве на Visual Studio (много работы), либо путем создания библиотек ссылок из DLL: http://support.microsoft.com/kb/131313/en-us
Обратите внимание, что, как правило, это не работает - это работает только в том случае, если API библиотеки основан на C (а не на C++), и если нет несоответствующих распределений (где вы выделяете, а библиотека освобождает, или и наоборот) и если компилятор, сгенерировавший файлы.dll, совместим с ABI с Visual Studio.
Вы также можете сгенерировать связываемые библиотеки путем создания библиотеки-заглушки с пустыми реализациями и использовать.lib из этого, или вы можете использовать динамическую загрузку, используя LoadLibrary() и GetProcAddress().
Так что, да, разработчики libopusfile не особо помогли подавляющему большинству разработчиков на базе Windows при создании версии библиотеки для Windows.
Кстати, у меня были проблемы с этим очень бесполезным SDK, и я решил их и перепаковал решение для Visual Studio. Это включает в себя дополнительные файлы заголовков, которые были необходимы, но не включены, а также генерирует библиотеку с возможностью.lib из функций, найденных с помощью dumpbin. Обратите внимание, что это не было тщательно протестировано, но у меня есть работающий инструмент воспроизведения файлов opus, основанный на этом:
http://www.enchantedage.com/opusfile-0.6-for-visual-studio
Это включает в себя заголовки и файл.lib, необходимые для Visual Studio.
Библиотеки C++ обычно состоят из заголовочных файлов (для компилятора) и библиотечных файлов (для компоновщика). Вы предоставили только заголовочные файлы, но не библиотечные файлы, поэтому компоновщик жалуется. Путь включения предназначен только для заголовочных файлов и не имеет ничего общего с компоновщиком [*].
Библиотека, которую вы скачали, вероятно, содержит файл *.lib. Это файл, необходимый компоновщику. В Visual Studio укажите каталог файла в "Каталоги VC++> Библиотечные каталоги" (предпочтительно в так называемом окне "Property Manager"), а в настройках проекта укажите файл *.lib в "Linker > Input > Дополнительные зависимости ".
Теперь вот трудность: вы должны убедиться, что ваш проект скомпилирован с той же библиотекой времени выполнения, с которой был создан файл *.lib. Например, если файл *.lib был создан с /MD, то вы должны сделать то же самое. Если файл *.lib не предоставлен (для вас) правильным способом, то вы в конечном итоге захотите собрать библиотеку самостоятельно.
[*] На самом деле, в MSVC вы можете использовать автоматическое связывание через заголовочные файлы, метод, используемый некоторыми библиотеками Boost, но давайте пока проигнорируем это.