2016-02-19 6 views
1

В библиотеке Qt имеется двоичная совместимость между основными выпусками. Но как насчет совместимости между разными компиляторами?Совместимость qt dll между компиляторами

Например, у меня есть приложение и 2 dll, которые используют Qt (динамически связанные). Но один из них построен с MSVC, а другой с MinGW. Таким образом, они связаны с различными сборками библиотеки Qt (той же версии).

Вопрос: возможно ли, чтобы эти DLL работали вместе, используя одну общую Qt-dll? Если нет, то какие обходные пути возможны, учитывая, что смена компилятора не является вариантом?

Я посмотрел на Qt dlls с зависимым ходоком, и я вижу, что есть десятки экспортируемых функций, которые имеют компилятор-специфическое имя. Поэтому кажется, что невозможно заставить их работать вместе.

+0

*** Но как насчет совместимости между различными компиляторами? *** Они несовместимы из-за более чем 1 CRT (приведет к случайному искажению кучи) и различной реализации стандартной библиотеки (также UB). – drescherjm

+0

Да, но нужно использовать только одну Qt dll -> таким образом, только один Qt CRT. –

+0

Qt может быть из одного компилятора, но я предполагаю, что оба .dll USE Qt или даже стандартная библиотека C++. Если это так, у вас будут объекты, которые пересекают границы CRT и несовместимые проблемы с ABI. – drescherjm

ответ

2

C++ не имеет стандартного ABI. Это значит, что двоичные файлы, включая DLL-файлы, обычно не совместимы между компиляторами (они могут даже не быть совместимыми с разными вариантами сборки на одном компиляторе ...). Это касается MSVC и MinGW, не совместимости с DLL.

В библиотеках Plain C есть определенные ABI для Windows, поэтому их можно использовать с любым компилятором (вы все равно можете столкнуться с проблемами с библиотеками, несовместимыми с зависимостями, даже если ABI совместим).


Если перекомпиляции одна библиотеки не вариант, то только обходной путь я знаю, чтобы иметь отдельные процессы, которые затем взаимодействуют с помощью какого-то механизма IPC. Если обе библиотеки предлагают элементы GUI, и вы хотите смешать их в одном графическом интерфейсе, это невозможно (или, по крайней мере, сложно, вам нужно открыть окно другого приложения в окне другого, вроде как наложение).

+0

Да, я это знаю. Но я думал, что Qt был разработан с учетом подхода COM. Похоже, это неправда. И да, мне нужно взаимодействие с графическим интерфейсом. –

+0

Qt не разработан как COM. – drescherjm

+0

@ArtyomChirkov Qt является чистым C++ (да, некоторый код генерируется * moc *, но сгенерированный код также является чистым C++ и связан с тем, что делает компилятор C++), и не может действительно работать вокруг такого низкоуровневого incompatibilites, как имя mangling в двоичных библиотеках. – hyde