Как заставить MSVC ++ игнорировать зависимости CRT статической библиотеки? - PullRequest
2 голосов
/ 26 марта 2009

Я не знаю, возможно ли это сделать, но я бы хотел, чтобы / NODEFAULTLIB применялся к проекту статической библиотеки.

У меня есть много проектов приложений (A.exe, B.dll, C.dll), которые используют общую статическую библиотеку D.lib. В этой библиотеке много кода, а также есть другие зависимости .lib. Одна из них - библиотека openssl, которая, кажется, была построена для win32 против версии CRT выпуска (у меня нет исходного проекта / источников).

Пока что, чтобы избежать смешивания версий CRT Release / Debug, я должен поместить директиву /NODEFAULTLIB:msvcrt.lib во все конечные проекты (A.exe, B.dll). Это работает, но я думаю, что это не идеальный способ решения этой проблемы. Я пытался поместить это свойство в проект D.lib, но это не имеет никакого эффекта.

Есть ли способ заставить msvc ++ игнорировать зависимость msvcrt.lib из сторонней библиотеки?

Ответы [ 3 ]

2 голосов
/ 13 мая 2009

.Lib не имеет никаких настроек компоновщика, потому что вы не связываете его, вы связываете с . .Lib - это просто архив файлов .obj, что-то вроде несжатого файла .zip, поэтому вы должны установить этот параметр на все проекты, которые ссылаются на него.

Если вы используете VS2005 +, вы могли бы использовать листы свойств, чтобы вам оставалось только установить параметр в одном месте, а затем использовать этот лист свойств во всех проектах.

Однако OpenSSL - это всего лишь Open Source, поэтому вы должны иметь возможность получить исходный код для используемой версии и собрать его заново (и, конечно, добавить его в свою систему контроля версий). Я думал, что OpenSSL может быть построен как DLL или LIB, что решит вашу проблему, поскольку DLL не будет мешать компоновке вашего кода.

В противном случае у вас всегда есть возможность выделить свою функциональность в отдельную DLL, чтобы у вас были проблемы только с одним проектом.

0 голосов
/ 17 февраля 2014

Чтобы ваша распределенная статическая библиотека ссылок не зависела от конкретной библиотеки времени выполнения MSVC, вам нужно установить этот параметр компилятора (в Visual Studio 2010 это выглядит так):

Свойства конфигурации -> C / C ++ -> Дополнительно -> Пропустить имя библиотеки по умолчанию = Да (/ ZI)

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

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

0 голосов
/ 13 мая 2009

Насколько я понимаю, если библиотека LIB статически связана с DLL, DLL содержит уже весь соответствующий код из LIB. Следовательно, эта муфта не может быть удалена. Это просто основано на моем понимании статических связей, а не на экспериментах.

...