Можно ли построить в C ++ DLL, которая не имеет зависимостей? - PullRequest
6 голосов
/ 04 декабря 2008

Я хотел бы развернуть очень простую DLL с моим C # -приложением, но любая DLL, которую я собираю в Visual Studio 2008, похоже, зависит от "Microsoft.VC90.CRT". Можно ли построить DLL с использованием VS2008 без этой зависимости? Как я могу сказать, что вызывает зависимость?

Ответы [ 6 ]

12 голосов
/ 04 декабря 2008

Я не уверен насчет последних версий VC ++, но ранее вы могли сказать компоновщику связать статическую версию библиотеки времени выполнения MSVCRT вместо динамической (DLL) версии. Возможно, эта опция все еще существует.

7 голосов
/ 04 декабря 2008

Согласно этой странице MSDN , статические библиотеки все еще доступны. Перейти к свойствам проекта, свойствам конфигурации, C / C ++, генерации кода, библиотеке времени выполнения.

Выберите Многопоточная отладка для конфигурации отладки и Многопоточная для конфигурации выпуска. (Не уверен, что имена совпадают в VS2008, но должны быть где-то там. Может обновиться завтра с различиями, специфичными для VS2008)

Также, как предложил wbic16, используйте средство обхода зависимостей для определения других статических зависимостей.

3 голосов
/ 04 декабря 2008

Если вы абсолютно уверены, что у вас нет каких-либо зависимостей от среды выполнения C, то вы можете избежать связывания с ней, включив флаг «Игнорировать все библиотеки по умолчанию» (/ NODEFAULTLIB) под Linker -> Параметры ввода проекта стр. Вам также может потребоваться отключить базовые проверки во время выполнения (установите для «Базовые проверки во время выполнения» значение «По умолчанию» в C / C ++ -> «Генерация кода»), а также может потребоваться удалить точку входа (установите «Без точки входа» в «Да ( NOENTRY) "под Linker -> Advanced).

См. Также http://support.microsoft.com/kb/814472, В нем содержится полезная информация о создании библиотек DLL для управляемых расширений для C ++.

Редактировать: Обратите внимание, что запуск без среды выполнения C также означает, что у вас нет функции простого выделения памяти, такой как malloc () и new.

1 голос
/ 05 декабря 2008

Немного потрудившись, libCTiny по-прежнему работает в качестве замены для библиотеки по умолчанию. Этот вид библиотеки делает / NODEFAULTLIB пригодным для использования.

Чтобы ответить на ваш второй вопрос, с помощью переключателя компоновщика / VERBOSE он сообщит вам, какие символы взяты из какой библиотеки.

1 голос
/ 04 декабря 2008

Дайте этому инструменту шанс: http://www.dependencywalker.com/. Это позволит вам пройти через ваши зависимости от данного exe или dll.

0 голосов
/ 05 декабря 2008

Убедитесь, что ваша сборка каждой вещи в выпуске, как часто в отладке, dll связана со специальными отладочными dll, которые обычно не поставляются с окнами и вызовут проблемы зависимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...