У меня нет опыта работы с Windows, только Linux. Я пытаюсь скомпилировать проект как проект Visual Studio. Простое открытие проекта и сборка идет нормально, но когда я запускаю, Windows сообщает мне, что не может найти некоторые .dll, которые поставляются с проектом, но находятся за пределами папки проекта Visual Studio. Он также поставляется с файлами .lib с тем же именем.
Должен ли я связать эти файлы lib в процессе сборки? Думаю, нет, потому что, если бы я сделал это, он бы уже был включен в проект Visual Studio.
Могу я тогда их установить? Или я могу указать своему исполняемому файлу, где их найти при запуске?
Импортируйте библиотеку, используя #pragma comment(lib,"libname")
где-нибудь в вашем источнике, затем вызовите функции, которые экспортируются в библиотеку. Если они находятся в dll, то связывание библиотеки загрузит dll автоматически, и вам все равно нужно будет вызывать экспортированные функции. — person Guerlando OCs schedule 14.02.2020
@Nina Теперь, когда вы подали идею, я заметил, что действительно существует код, который импортирует эти .lib
файлы: WPMainCore.lib, CTMedia.lib, CTStream.lib
. Однако когда я запускаю исполняемый файл, я получаю сообщение об ошибке, в котором говорится, что, например, CTStream.DLL
не может быть найден. Почему он использует .lib
, но при беге жалуется на dll
? — person Guerlando OCs schedule 14.02.2020
stackoverflow.com/questions/1776060/ — person Guerlando OCs schedule 14.02.2020
@HansPassant, спасибо. Но если я строю с x.lib
, почему Windows жалуется, что x.dll
не может быть найден при запуске программы? Разве x.lib
уже не следует что-то реализовывать? — person Guerlando OCs schedule 14.02.2020
x.lib — это библиотека импорта для x.dll. Он просто перечисляет экспортируемые функции, он не содержит никакого кода. Код живет в dll. — person Guerlando OCs schedule 14.02.2020
@HansPassant, прежде чем комментировать здесь, я искал dll vs lib, и они сказали, что это было похоже на .a
и .so
, но, видимо, это не так. Потому что, когда я связываю .a
, мне не нужно указывать .so
. Но разве в .h
файле не должны быть перечислены экспортируемые функции? Зачем нужен .lib
? — person Guerlando OCs schedule 14.02.2020
@guerlando, если у вас есть доступ к CTStream.dll, просто поместите его в каталог исполняемого файла. Если вы сами компилируете CTStream и хотите связать только библиотеки и не нуждаетесь в DLL, скомпилируйте проект как / MT в настройках компоновщика VS. Я не уверен, откуда у вас файлы lib без dll — person Guerlando OCs schedule 14.02.2020
Есть два типа файлов .lib. Статические библиотеки похожи на .a, они содержат код, а компоновщик связывает его с основным исполняемым файлом. Нет .dll не требуется. Но библиотека импорта — это просто список функций, которые экспортируются с помощью .dll. Компоновщику необходимо, чтобы он знал, где находится функция, и использует его для создания таблицы импорта в исполняемом файле. Это в первую очередь необходимо, потому что экспортируемая функция в .dll не обязательно должна иметь имя. То, что эти файлы имеют одинаковое расширение имени файла, было неудачным выбором. — person Guerlando OCs schedule 14.02.2020
Предлагаю вам обратиться к документу: Пошаговое руководство: создание и использование собственной библиотеки динамической компоновки — person Guerlando OCs schedule 14.02.2020