Visual Studio: как указать разные библиотеки времени выполнения для компоновщика? (/ MTd, MDd и т. Д.) - PullRequest
4 голосов
/ 29 ноября 2010

Я ссылаюсь на несколько библиотек в VS2008. Если мои знания о компоновщике верны, MTd предназначен для статического связывания, а MDd - для динамического связывания (с DLL). Моя цель - статически связать некоторые библиотеки и динамически связать другие. Параметры проекта, кажется, имеют только одну настройку для всех библиотек во входных данных компоновщика. Как бы я это сделал?

Ответы [ 3 ]

4 голосов
/ 29 ноября 2010

Нет, вы все путаете. Параметры / MD против / MT относятся только к той версии CRT, на которую вы ссылаетесь. Есть две, статическая версия (/ MT), которую вы должны использовать, только если вы не используете никаких DLL в своем проекте. И версия DLL, версия, которой каждый двоичный файл в вашем процессе может поделиться, чтобы у вас не было проблем с распределением кучи. Вид страданий, которые вы испытываете, когда память выделяется одним модулем и освобождается другим.

Выбор ваших собственных библиотек полностью зависит от вас. Микширование и сопоставление - это хорошо, компоновщик просто получает другой вид .lib. Библиотека импорта вместо статической библиотеки. Просто имейте ввиду использование / MD при использовании DLL.

4 голосов
/ 29 ноября 2010

Вашему проекту будет присвоено разумное значение C Runtime Library по умолчанию после того, как вы его настроите, в зависимости от того, как вы ответите на запросы мастера нового проекта.Вы можете проверить и изменить это (при необходимости) следующим образом:

  • щелкните правой кнопкой мыши соответствующий проект в обозревателе решений, выберите Свойства
  • , просмотрите раздел Свойства конфигурации, C / C ++, КодGeneration, Runtime Library.

Другие библиотеки могут быть связаны, как вы хотите, вы просто указываете библиотеку для ссылки в Linker, Input, Additional Dependencies.

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

Вам необходимо убедиться, что файлы LIB, на которые вы ссылаетесь, используют ту же CRT, что и ваше приложение, иначе все может пойти не так, как надо.

0 голосов
/ 29 ноября 2010

Опции компоновщика, которые вы описываете, предназначены только для CRT. Статическая версия ограничит использование памяти между модулями.

Все остальные используемые вами библиотеки будут связаны в зависимости от того, какие либ-файлы вы предоставляете (или нет) компоновщику.

Существует 3 способа использования библиотеки MS

  1. статически связанная статическая библиотека (.lib equivelant .a архива .o)
  2. статически связать заглушку (сгенерированный компилятором .lib loadlib / getproc) динамической библиотеки
  3. загрузка динамической библиотеки вручную (loadlib / getprocaddress)
...