Компиляция статической библиотеки внутри exe - PullRequest
3 голосов
/ 15 декабря 2009

У меня есть dll и exe, оба из которых у меня есть источники.

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

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

Зачем мне это делать?

Ответы [ 2 ]

7 голосов
/ 15 декабря 2009

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

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

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

3 голосов
/ 15 декабря 2009

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

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

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

...