Динамическое и статическое связывание и развертывание в Visual Studio 2010 - PullRequest
8 голосов
/ 05 марта 2012

У меня неуправляемый проект C ++ в Visual Studio 2010. Он использует boost, glut и другую библиотеку от поставщика.

Я настроил проект для создания более "независимого от dll" исполняемого файлавозможный.Все библиотеки boost связаны статически, и в каталоге, где находится исполняемый файл, нет необходимости в dll.

То же самое для Glut, я связал static glut32.lib вместо glut32.dll иопять нет проблем.

Я выбрал для библиотек времени выполнения версию NON-dll, то есть многопоточную отладку (для конфигурации отладки) и многопоточную для конфигурации выпуска.

Теперь я был продавцомговоря ранее, предоставляет две альтернативы Vendor.lib и Vendor.dll.

Vendor.lib добавляется в зависимости компоновщика-> Дополнительные, но во время выполнения я всегда должен помещать Vendor.dll в одну и ту жедиректории исполняемого файла, в противном случае среда выполнения жалуется, потому что не находит библиотеку Vendor.dll.

Как мне решить эту проблему?Я хотел бы избегать помещать в каждый каталог файл .dll.

Я не хочу помещать dll в один и тот же каталог exe и вообще каковы рекомендации по развертыванию неуправляемых консольных приложений c ++в Visual Studio?

Я знаю, что есть много вопросов и страниц об этом аргументе, но ни один из них не прояснил мне этот вопрос.

Какая-то идея?

Ответы [ 2 ]

10 голосов
/ 05 марта 2012

Microsoft немного забавна в том, как она справляется с этим: когда вы создаете .dll, вы также создаете .lib, который содержит публичные символы в .dll.Вы должны связать с .lib для загрузки .dll во время выполнения, но этот .lib по-прежнему не является статической библиотекой.Если ваш поставщик предоставляет версию для статической компоновки, то не будет ни DLL, ни двух .lib (предположительно в разных каталогах или с разными именами).Еще один пример того, как Microsoft делает серьезную разработку более сложной, чем необходимо.

7 голосов
/ 05 марта 2012

Vendor.lib должен быть статически скомпилированной библиотекой.Если, когда вы связываете это, вам все еще нужен Vendor.dll, похоже, что Vendor.lib на самом деле является библиотекой импорта, а не статической библиотекой.

Проверьте, предоставляет ли поставщик другой Vendor.lib (который должен бытьнемного больше, чем ваш текущий .lib), который является статической библиотекой, и попробуйте добавить ссылку на него.Если это так, вам не понадобится DLL.

...