Как отключить строгую проверку const во время компиляции с помощью gcc?

#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, и ошибка исчезла.