Вы говорите, что включаете файл libheader.h
в блок extern "C"
, но символ, который ищет компоновщик, был искажен.
Это признак того, что libheader.h
также включается вне блока extern "C"
(включение в блоке extern "C"
, вероятно, недопустимо из-за включения защиты в libheader.h
).
Найдите другие способы, которыми libheader.h
может быть включен. -E
GCC и / или различные опции -M
могут помочь, а могут и не помочь. Или (если только для теста) переместите блок extern "C"
внутрь libheader.h
:
// at start of libheader.h:
#ifdef __cplusplus
extern "C" {
#endif
/* existing contents of libheader.h */
// ...
// at end of libheader.h:
#ifdef __cplusplus
}
#endif
Обратите внимание, что спецификации связей могут быть вложенными, поэтому вам не нужно удалять существующие блоки extern "C"
на сайтах #include
.
Я не знаю, почему проблема возникла бы только для оптимизированных сборок, за исключением того, что, возможно, файл .c или .cpp, который содержит не встроенную версию вызывающей функции, правильно определяет заголовки, и нужно только один модуль перевода, который неправильно определяет заголовки и указывает на вызывающую функцию, чтобы увидеть проблему.