Это старая проблема статических библиотек: он должен использовать тот же CRT исполняемого файла, который связывается с ним, иначе компоновщик найдет конфликтующие версии одних и тех же процедур CRT и структур данных (как открытых, так и внутренних).).
Поскольку в настоящее время существует 4 версии CRT (все комбинации отладки / выпуска и dll / статические ссылки), вы должны предоставить 4 различных файла .lib
вашей библиотеки.Кстати, это одна из причин, по которой почти никто не распространяет статические библиотеки в форме .lib
(если они не являются просто библиотеками импорта), но предоставляют исходные коды для компиляции любым способом, который предпочитает пользователь библиотеки.
ЕслиВам не нравится это, вы должны рассмотреть вопрос о распространении вашей библиотеки как DLL.В этом последнем случае вы все равно должны быть осторожны с CRT, потому что, если dll и программа, которая ее использует, не используют один и тот же CRT (например, один из них использует версию CRT со статической связью, или они используют разные версии).из CRT с динамическим связыванием) для правильной работы нельзя полагаться на несколько средств C ++;наиболее очевидная проблема заключается в том, что вы не можете delete
вещи, которые были выделены с new
другим модулем, потому что два CRT используют две разделенные кучи.
Также, пытаясь передать типы, определенные в C ++библиотека между модулями, вероятно, приведет к проблемам, потому что ничто не гарантирует, что они двоично совместимы между различными версиями CRT (и часто они не будут).RTTI и исключения также являются проблемными областями, если вы не соответствуете CRT.
Короче говоря: со статическими библиотеками вы должны соответствовать CRT, иначе различные модули не будут связаны друг с другом.С dll, правильно сопоставьте ЭЛТ и все должно работать нормально.В противном случае единственная разумная альтернатива - предоставить интерфейс в стиле C и позволить каждому модулю управлять своими выделениями памяти (возможно, экспортируя свои malloc
/ free
, чтобы позволить другим модулям выделять / освобождать память из кучи модуля).