Теперь я могу скомпилировать cgicc.Спасибо моему очень хорошему другу Владу Лазаренко и нескольким часам расследования.Но я должен сделать некоторые серьезные изменения.
Мой друг помог мне пойти по правильному пути, понимая основную проблему.Он и Влад Лазаренко дали мне хорошее руководство для расследования __declspec()
.Это особенность компиляторов Microsoft, которые теперь поддерживаются в gcc .
. В ходе исследования я наткнулся на сообщение с подсказками миграции для GCC3.4.3 в GCC4.1.2 ,Поэтому я перенес явную реализацию шаблонов за объявленное пространство имен в следующих заголовках:
Cgicc.h
CgiEnvironment.h
HTMLAttributeList.h
HTMLElementList.h
Затем я обнаружил странное поведение при проверке различных переключателей компилятора и других вещей, касающихся моей среды сборки.Во время исследования заголовочных файлов cgicc определенный -DCGICC_EXPORTS
иногда становится неопределенным (расширение показано в Eclipse CDT).Поэтому я изменил CgiDefs.h
с:
// export library symbols
#ifdef CGICC_EXPORTS
# define CGICC_API __declspec(dllexport)
#else
# define CGICC_API __declspec(dllimport)
#endif
на
# define CGICC_API __declspec(dllimport)
В конце я изменил переключатели компилятора на
-DWIN32 -DCGICC_EXPORTS -DHAVE_CONFIG_H -I.. -O0 -g3 -Wall -c -fmessage-length=0 -std=gnu++98
.Наиболее важным является -std=gnu++98
.Без расширений gnu __declspec()
не будет генерировать символы - даже для статической библиотеки.Я не понимаю, зачем мне это нужно для статической библиотеки, потому что символы должны быть в их объектных файлах, которые упакованы в libcgicc.a
.
Теперь некоторые дополнительные вопросы:
- DoКто-нибудь знает механизм, как
CGICC_EXPORTS
может стать неопределенным без
#undef CGICC_EXPORTS
и без -UCGICC_EXPORTS
? - Почему я должен использовать расширения GNU?Я думал, что значения по умолчанию независимы.
- Почему я должен использовать
__declspec(dllexport)
для статической библиотеки? - Почему недостаточно использовать объектные файлы статической библиотеки?Позвольте мне спросить то же самое по-другому: почему не обнаруживаются символы, если я пытаюсь связать объектные файлы статической библиотеки?
- В чем преимущество / недостаток «неявной реализации шаблона и расплывчатой связи» по сравнению с «»явная реализация шаблона "?