Какие настройки оптимизации следует использовать для библиотеки C ++ - PullRequest
4 голосов
/ 11 июля 2011

Я хочу написать (статическую) библиотеку для других программистов, которая использует оптимизацию компилятора.

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

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

LIBCMTD.lib (tzset.obj): ошибка LNK2005: __tzset уже определен в MSVCRT.lib (MSVCR90.dll)

Какие настройки мне следует использовать при сборке библиотеки, чтобы программисты могли использовать библиотеку в своих собственных проектах, чтобы она работала приемлемо быстро, независимо от того, используют ли они отладочную или выпускную сборки?

Ответы [ 3 ]

4 голосов
/ 11 июля 2011

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

3 голосов
/ 11 июля 2011

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

0 голосов
/ 11 июля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...