Является ли /nodefaultlib:msvcr100 правильным подходом к решению проблемы msvcr100.dll и msvcr100d.dll defaultlib?

Для проекта кроссплатформенного программного обеспечения, основанного на Linux и Windows, у нас есть разные способы работы со сторонними библиотеками. В Linux мы собираем и связываем версии, распространяемые с дистрибутивом CentOS/RHEL, что означает, что мы связываемся с выпусками сборок, тогда как в Windows мы поддерживаем наши собственные пакеты сторонних библиотек, а в Windows мы собираем две версии каждой библиотеки — выпуск. версия, связывающая msvcr100 и msvcp100, и отладочная версия, связывающая msvcr100d и msvcp100d.

Мой вопрос заключается в том, необходимо ли создавать отладочную версию сторонних зависимостей в Windows, или мы можем просто использовать /nodefaultlib:msvcr100 при создании отладочных сборок нашего собственного программного обеспечения.

Дополнительный вопрос: где я могу узнать о передовом опыте в этом отношении. Я читал страницы MSDN о среде выполнения msvc, но там очень мало рекомендаций.

РЕДАКТИРОВАТЬ:

Позвольте мне перефразировать вопрос более кратко. В VS2010, в чем проблема с использованием /nodefaultlib:msvcr100 для связывания исполняемой сборки с /MDd при связывании с библиотеками, скомпилированными с /MD.

Моя мотивация для этого состоит в том, чтобы избежать необходимости создавать как выпускную, так и отладочную версию сторонних библиотек, которые я использую. Также я хочу, чтобы моя отладочная сборка работала быстрее.

Из документа для /MD, /MT, /LD (использовать библиотеку времени выполнения):

MD: заставляет ваше приложение использовать версию библиотеки времени выполнения, ориентированную на многопоточность и DLL. Определяет _MT и _DLL и заставляет компилятор поместить имя библиотеки MSVCRT.lib в файл .obj.

Приложения, скомпилированные с этой опцией, статически связаны с MSVCRT.lib. Эта библиотека предоставляет слой кода, который позволяет компоновщику разрешать внешние ссылки. Фактический рабочий код содержится в MSVCR100.DLL, который должен быть доступен во время выполнения для приложений, связанных с MSVCRT.lib.

/MDd: определяет _DEBUG, _MT и _DLL и заставляет ваше приложение использовать отладочную многопоточную и специфичную для DLL версию библиотеки времени выполнения. Это также заставляет компилятор помещать имя библиотеки MSVCRTD.lib в файл .obj.

Таким образом, нет никакой документации для каких-либо изменений в сгенерированном коде, кроме определения _DEBUG.


person pong    schedule 06.10.2013    source источник


Ответы (1)


Вы используете только отладочную сборку CRT для отладки своего приложения. Он содержит множество утверждений, которые помогут вам обнаружить ошибки в вашем коде. Вы никогда не отправляете отладочную сборку своего проекта, всегда выпускаете сборку Release. Вы тоже не можете, лицензия запрещает отправку msvcr100d.dll. Таким образом, правильное построение проекта автоматически позволяет избежать зависимости от отладочной версии CRT.

Параметр компоновщика /nodefaultlib был предназначен для того, чтобы позволить связать вашу программу с пользовательской реализацией CRT. Довольно редко, но некоторые программисты очень заботятся о создании небольших программ, а стандартный CRT не совсем маленький.

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

Так что нет, это не правильный выбор, вашей целью должно быть решение основной проблемы. Убедитесь, что все ваши файлы .obj и .lib созданы с одинаковыми параметрами компилятора, и у вас не возникнет этой проблемы. Если это означает, что вам нужно приставать к владельцу библиотеки для правильной сборки, тогда приставайте сначала, обходите его только тогда, когда вы обнаружите, что больше не хотите иметь зависимость от этого .lib, но еще не имеете пора искать альтернативу.

person Hans Passant    schedule 06.10.2013
comment
Привет Ганс, спасибо за ответ. Это не совсем то, что я ищу, но я возьму на себя вину за это. Мой вопрос плохо сформулирован. Я обновлю его в ближайшее время. - person pong; 10.10.2013