#c #gcc #compilation
Вопрос:
В последнее время я занимаюсь некоторыми компиляционными работами. После обновления openssl1.1.1 f до openssl1.1.1 h я обнаружил некоторые ошибки компиляции для пакетов, использующих заголовки openssl «bio.h» и «evp.h». Это потому, что openssl1.1.1 h добавляет что-то вроде этого:
/* * name is cast to lose const, but might be better to route through a * function so we can do it safely */ #ifdef CONST_STRICT /* * If you are wondering why this isn't defined, its because CONST_STRICT is * purely a compile-time kludge to allow const to be checked. */ int BIO_read_filename(BIO *b, const char *name); # else # define BIO_read_filename(b,name) (int)BIO_ctrl(b,BIO_C_SET_FILENAME, BIO_CLOSE|BIO_FP_READ,(char *)(name)) # endif
Если параметр CONST_STRICT определен, вы должны реализовать api самостоятельно, иначе на этапе компоновки вы получите неопределенную ошибку ссылки. Интересно, какой параметр компиляции я должен добавить, чтобы значение CONST_STRICT НЕ было определено? Заранее спасибо!
Комментарии:
1. Вы уверены , что вам нужно реализовать эту функцию самостоятельно, и что вы просто не забываете связать ее с какой-нибудь библиотекой?
2. Да, я так думаю. Я искал библиотеки, созданные компиляцией libopenssl, ни одна из этих функций не найдена.
3. Ваш вопрос : как определить CONST_STRICT ? почему бы не прокомментировать то
#define CONST_STRICT
, что должно быть где-то в файле .h или в настройках проекта ?4. как уже объяснялось, макрос
BIO_read_filename
-это всего лишь трюк, чтобы избавиться отconst
классификатора и избежать ошибки компиляции. Вы можете реализовать реальную функцию вместо этого макроса, которая смогла бы сохранить, чтобы отменить «преобразование».5. @Guillaume Petitjean Может быть, я не понял, что означает комментарий в заголовке openssl? Параметр CONST_STRICT не создается автоматически в процессе компиляции, а определяется кем-то, кто хочет использовать какой-либо пользовательский api вручную?
Ответ №1:
Я не понял, что означает комментарий в заголовочном файле openssl, благодаря Гийому Петиджану, который поправил меня. Ошибка, которую я получил, вызвана другой причиной. В одном из моих пакетов есть более старая версия openssl, и он установил свои заголовочные файлы после сборки. В этой версии api BIO_read_filename был реализован не по определению marco, а в исходном файле. Я изменил файл makefile пакета, чтобы не устанавливать более старый файл заголовка openssl, и ошибка исчезла.