2015-04-30 2 views
0

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

У меня есть сборка управляемого C++, которую мои «клиенты» используют для связи с проектами C# /. NET. Эта сборка без проблем запускает статические C++-библиотеки OpenSSL, но не будет загружать мою неуправляемую статическую библиотеку C++ (назовите ее «MyLib.lib»).

Сначала это было потому, что «MyLib.lib» использовал статическую привязку ЭЛТ, но я переключил ее на использование DLL-версии CRT. К сожалению, все, что было сделано, изменило проблему.

Теперь, когда я компилирую сборку Managed C++, он ищет «MyLibmdd.lib» - который, конечно, не существует. Зачем это искать, когда я указываю вход компоновщика как «MyLib.lib»? И что он думает в «MyLibmdd.lib» и почему он требует, чтобы он существовал?

Он не требует «libeay32mdd.lib» или «ssleay32mdd.lib», так почему же он обрабатывает мою статическую библиотеку по-разному?

В конечном счете, я знаю, что я смогу вытащить «MyLib.lib» в управляемый проект C++, потому что другие сделали это (включая OpenSSL). Таким образом, казалось бы, есть что-то, что я не знаю о том, как следует строить «MyLib.lib».

Любые идеи, что я должен проверить на этом этапе? Я использую Visual Studio 2013.

Спасибо!

+0

Есть разные сборки, с которыми можно связаться. При подключении к DLL CRT вы выбрали его многопоточным и отладочным (это то, что имеет суффикс mdd). Linker предположил, что у вас есть разные сборки вашей библиотеки, а также ищет аналогичный суффикс, чтобы убедиться, что все библиотеки соответствуют –

+0

Не уверен, что я следую. «MyLib.lib» был скомпилирован с/Md, как и сборка Managed C++. Таким образом, сборка Managed C++ уже должна иметь то, что она ищет. Я попытался удалить «MyLib.lib» из ввода компоновщика в проекте сборки Managed C++, но потом он пожаловался, что не смог найти «MyLib.lib». Поэтому я вернул его, и теперь он хочет «MyLibmd.lib» (в режиме выпуска). Зачем нужны две версии .lib? Если да, то почему проект «MyLib.lib» не выплевывает два .lib-файла? И опять же, он не ищет то же самое из других файлов с открытым исходным кодом .lib. – Bungles

+0

Существуют проблемы, связанные с объединением библиотек отладки и выпуска. Итак, из того, что я знаю, MyLib.lib считается именем «семейства библиотек». Какая конкретная библиотека связана, определяется суффиксом, который автоматически добавляется из настроек компиляции. Вам действительно нужно иметь как минимум две библиотеки (один отладчик и один выпуск) для данной настройки компилятора и сделать соответствующий суффикс http://stackoverflow.com/questions/11658915/mixing-debug-and-release-library-binary- bad-practice –

ответ

0

Проблема заключалась в том, что в ряде мест существовали строки #pragma comment (...), которые препятствовали наименованию выходных библиотек на моем пути. Прокомментировал это, и пока все хорошо.

Смежные вопросы