Стандарт C ++ не определяет стандартный ABI, и это плохая новость для людей, пытающихся создавать библиотеки C ++. Это означает, что вы получаете различное поведение от вашего скомпилированного кода в зависимости от того, какие флаги использовались для его компиляции, и это может привести к таинственным ошибкам в коде, который прекрасно компилируется и связывается.
Это выходит за рамки просто различных соглашений о вызовах - код C ++ может быть скомпилирован для поддержки или не поддержки RTTI, обработки исключений и с различными оптимизациями, которые могут влиять на структуру памяти экземпляров классов, на которые опирается код C ++.
Итак, что вы можете сделать? Я собирал библиотеки C ++ внутри моего исходного кода и следил за тем, чтобы они создавались как часть сборки моего проекта и чтобы все библиотеки и код, ссылающийся на них, использовали одинаковые флаги компилятора.
Обратите внимание, что искажение имени, которое должно было, по крайней мере, помешать вам связывать объектные файлы, которые были скомпилированы с разными флагами компилятора / компилятора, только в основном работает, и есть некоторые вещи, которые вы можете сделать, особенно с GCC, которые приведут код, который связывает просто отлично и терпит неудачу во время выполнения.
Вы должны быть особенно осторожны с поставляемыми поставщиком динамическими библиотеками C ++ (например, QT в большинстве дистрибутивов Linux). Я видел экземпляры поставляемых поставщиком библиотек, которые были скомпилированы таким образом, что некоторые вещи не могли работать должным образом. Например, некоторые выпуски Redhat Linux (возможно, все они) отключали исключения в QT, что делало невозможным перехват исключений в main (), если исключения были вызваны в обратном вызове QT. Fun.