Как я могу заставить MSVC ++ игнорировать зависимости CRT статической библиотеки?

StackOverflow https://stackoverflow.com/questions/687179

Вопрос

Я не знаю, возможно ли это сделать, но я бы хотел, чтобы /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 из своей сборки отладки и не пытаться ссылаться на неверную библиотеку времени выполнения, вызывая проблемы, а также предупреждения линкеров.

Примечание, которые могут вызвать ошибки ссылки, если ваша библиотека действительно зависит от конкретной библиотеки времени выполнения или ее поведения, а совместимые компоненты не предоставляются каким -либо другим способом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top