Предположим, у нас есть общая библиотека, которая принимает или возвращает некоторый класс std:
//lib.h
#include <vector>
std::vector<int> returnSomeInts();
//lib.cpp
#include "lib.cpp"
std::vector<int> returnSomeInts() {
return {1, 3, 5};
}
Итак, очевидно, что при компиляции общей библиотеки lib.so
этот код должен был быть скомпилирован с определенным версия стандартной библиотеки, например, с -std = c ++ 11.
Теперь представьте, что у нас есть приложение, которое будет использовать нашу разделяемую библиотеку, но оно будет скомпилировано, например, с более новой библиотекой std. -std = c ++ 2a
//app.cpp
#include <lib.h>
int main()
auto v = returnSomeInts();
//Process v
}
Поскольку стандартная библиотека определяет встроенные классы, при изменении макета членов класса совместимость ABI нарушается, поэтому приведенный выше код не будет работать должным образом.
Мои вопросы: есть ли гарантия стабильности ABI с общими реализациями библиотеки std при компиляции с одним и тем же заголовком с использованием различных стандартов c ++? А при компиляции с разными версиями заголовков (например, libstdc ++ - 8 и libstdc ++ - 9)?
PD: приведенный выше код является лишь примером, я не имею в виду конкретно std::vector