2008-12-04 3 views
6

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

ответ

12

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

+0

Это интересная идея. Кажется, MS рекомендует не делать этого, но если он решает мои проблемы ... – 2008-12-04 20:26:10

+0

Это работало как чемпион - спасибо. – 2008-12-05 15:18:24

1

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

+0

Кажется, что просто создание пустой DLL в VS2008 также имеет эту зависимость. Я еще не добавил никаких дополнительных ссылок или всего лишь пустого проекта. – 2008-12-04 18:04:18

7

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

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

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

3

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

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

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

1

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

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

0

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

Смежные вопросы