Как я могу заставить MSVC ++ игнорировать зависимости CRT статической библиотеки?
-
22-08-2019 - |
Вопрос
Я не знаю, возможно ли это сделать, но я бы хотел, чтобы /NodefaultLib был применен к проекту статической библиотеки.
У меня есть много прикладных проектов (A.Exe, B.Dll, C.DLL), в которых используется общая статическая библиотека D.Lib. Эта библиотека имеет много кода, а также имеет и другие зависимости. Одним из них является библиотека OpenSSL, которая, по -видимому, была построена для Win32 против версии CRT выпуска (у меня нет оригинального проекта/источников).
До сих пор, чтобы избежать смешивания версий CRT релиз /отладки, я должен поместить директиву Leffer Linker /nodefaultlib:msvcrt.lib во всех проектах листьев (A.exe, B.Dll). Это работает, но я думаю, что это не идеальный способ решения этой проблемы. Я попытался поместить эту собственность в проект D.Lib, но она не имеет никакого эффекта.
Есть ли способ заставить MSVC ++ игнорировать зависимость MSVCRT.LIB из сторонней библиотеки?
Решение
В. к Это. .LIB - это всего лишь архив файлов .OBJ, вроде несущественный файл .zip - вот почему вы должны разместить настройки на все проекты, которые ссылаются на него.
Если вы используете VS2005+, вы можете использовать листы свойств, чтобы вам нужно было поместить настройку в одном месте, а затем использовать этот лист свойств во всех проектах.
Тем не менее, OpenSSL - это просто открытый исходный код, поэтому вы сможете получить источник для версии, которую вы используете, и создать его снова (и, конечно, добавить его в систему управления версиями). Я думал, что OpenSSL может быть построен как DLL или LIB, что решило бы вашу проблему, поскольку DLL не будет мешать связыванию вашего кода.
В противном случае у вас всегда есть возможность вырезать ваши функциональные возможности на отдельный DLL, чтобы у вас были проблемы только с одним проектом.
Другие советы
Насколько я понимаю, если библиотека LIB в связи с статически в DLL, DLL содержит уже весь соответствующий код из LIB. Следовательно, эта связь не может быть удалена. Это просто основано на моем понимании статического связывания, а не на экспериментах.
Чтобы предотвратить распределенную библиотеку статических ссылок в зависимости от конкретной библиотеки времени выполнения MSVC, вам необходимо установить эту опцию компилятора (в Visual Studio 2010 это выглядит как):
Свойства конфигурации -> C/C ++ -> Advanced -> Опустить имя библиотеки по умолчанию = Да (/ZI)
Теперь ваши пользователи могут ссылаться на ваш релиз, созданный Static Lib из своей сборки отладки и не пытаться ссылаться на неверную библиотеку времени выполнения, вызывая проблемы, а также предупреждения линкеров.
Примечание, которые могут вызвать ошибки ссылки, если ваша библиотека действительно зависит от конкретной библиотеки времени выполнения или ее поведения, а совместимые компоненты не предоставляются каким -либо другим способом.