2009-12-14 4 views
3

У меня есть dll и exe, оба из которых у меня есть источники.Компиляция статического lib внутри exe

Для DLL Я скомпилирован полностью статически, и поэтому я бы предположил, что .lib также является статическим. Однако, когда я включаю этот lib в мой проект C++ VC++ 2008 в Linker> Input> Additional Dependencies. Я установил режим компиляции в/MT (многопоточное) для exe.

Все скомпилировано, но когда я пытаюсь запустить exe, он запрашивает DLL! К лучшему из моего (ограниченного) понимания это не должно происходить.

Почему я должен делать?

ответ

7

Параметр «режим компиляции», на который вы ссылаетесь, является настройкой библиотеки времени выполнения, которая связана с любой библиотекой или исполняемым файлом, который вы производите.

Если ваш проект настроен для создания DLL (проверьте главную страницу проекта), то он все равно будет создавать DLL независимо от того, что вы вставляете в настройку библиотеки времени исполнения. Что мне нужно сделать, это изменить настройку на главной странице проекта DLL из библиотеки DLL в статическую библиотеку вместо изменения настройки библиотеки времени выполнения.

Как только вы это сделаете, убедитесь, что исполняемые и библиотечные проекты имеют один и тот же параметр библиотеки времени выполнения (к которому вы обращаетесь), иначе вы получите массу странных сообщений об ошибках, если компоновщик пытаясь сопоставить две разные библиотеки времени исполнения в одном исполняемом файле.

+0

hmmm ... Это похоже на смысл ... Я сейчас пытаюсь это сделать. –

+0

У меня возникли проблемы с изменением моего файла makefile из DLL в статическую библиотеку. –

+0

У меня есть статическая библиотека. Я ставлю его как дополнительную зависимость, и все же он запрашивает DLL, когда я его запускаю. –

3

Файл .lib, созданный с помощью «статической» DLL, представляет собой библиотеку импорта, которая обрабатывает автоматическую динамическую привязку ко всем символам в библиотеке. Сама DLL (то есть DLL-файл) по-прежнему содержит все коды/символы/и т. Д. что вы ожидаете.

Статическая привязка к файлу .lib просто избавляет вас от ручного вызова LoadLibrary()/GetProcAddress() и т. Д. Для разрешения символов в DLL.

Вам все равно потребуется сама DLL, если вы не создадите настоящую статическую библиотеку (то есть со всеми символами &, а не только с импортом).

+0

ах. Спасибо за объяснение. теперь мне просто нужно перенастроить мой проект как статическую lib вместо dll. –

+0

Я поместил статическую библиотеку в зависимость, и она все еще запрашивает DLL. –

+0

@ Ramblingwood: Похоже, что вы все еще создаете библиотеку DLL + static import, а не статическую библиотеку кода. Пока вы этого не сделаете, вы не сможете избавиться от DLL. –

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