LINUX.ORG.RU

существует ли стабильный ABI для Qt?

 ,


2

4

Хотелось бы иметь какую-то штуку для обращения из скриптовых языков, чтобы не тащить при этом компилятор.

Когда-то был qt-c. Потом был cpp-кусок от qtjambi. Вроде тоже помер. Сейчас смотрю, что в PyQt свой мегавелосипед (SIP — интерфейс из питона к C++), PerlQt — закончился в 2003 году, RubyQt — требует развернуть mingw.

Qt теперь снова только для С++ (и Python)?

★★★★★

QtScript?

точнее, его уже вроде банят, QJSEngine из QML за него.

dib2 ★★★★★
()
Последнее исправление: dib2 (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Казалось бы, причем тут ABI

При том, что для любой нормальной библиотеки я могу взять символ из .so (или .dll) и выполнить функцию. Для этого достаточно знать документацию на функцию.

Например на Python:

libc = CDLL("libc.so.6")
print libc.time(None)

А для Qt при каждой компиляции имена создаются как компилятору захочется.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

для любой нормальной библиотеки я могу взять символ из .so (или .dll) и выполнить функцию

...если она написана на Си

А для Qt при каждой компиляции имена создаются как компилятору захочется

Неужели? А я-то думал, что манглинг и соглашение о вызовах стандартизированы.

Да, у Qt есть ABI. И нет, он тебе не поможет.

tailgunner ★★★★★
()
Ответ на: комментарий от a1batross

В В Qt куча goto (комментарий) мне пытались доказать, что Qt во всём лучше, чем GTK.

Соответственно пытаюсь уточнить, как с биндингами к другим языкам. Если «Qt лучше, чем Gtk, если писать на C++», то с этим я даже спорить не буду. Но С++ мир не ограничивается.

Кстати, cast wota, Pavval

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

А для Qt при каждой компиляции имена создаются как компилятору захочется.

удивительно, как же тогда я собираюсь clang против Qt 5.2.1, а программа запускается с системным Qt 5.0.2, который собран gcc...

wota ★★
()
Ответ на: комментарий от stopitplease

«Когда же с ЛОРа идиотов уберут...» (ц)

Хоть ты иди в модераторы и неси в массы разум.

tailgunner ★★★★★
()
Ответ на: комментарий от monk

если она написана на Си

Не обязательно

Ну мне-то не рассказывай...

Например, можно написать на OCaml

Это значит, что Ocaml умеет в тот же ABI, что и Си.

На любом языке с документированным ABI

C++ ABI документирован.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

C++ ABI документирован.

Ололо! Может ещё покажешь такой документ

stopitplease
()
Ответ на: комментарий от BRE

Соглашения о вызовах стандартизованы, а вот манглинг имен в С++, к сожалению, нет.

5.1 External Names (a.k.a. Mangling)

tailgunner ★★★★★
()
Ответ на: комментарий от monk

Попробуй собрать под виндой MSVC и использовать из gcc.

а там проблема совсем не в ABI будет (есть волшебный параметр), MSVC и mingw используют разные стандартные библиотеки

wota ★★
()
Ответ на: комментарий от monk

При том, что для любой нормальной библиотеки я могу взять символ из .so (или .dll) и выполнить функцию. Для этого достаточно знать документацию на функцию.

Так и есть.

А для Qt при каждой компиляции имена создаются как компилятору захочется.

4.2 Иначе это не библиотеки, а какие-то двоичные файлы.

У библиотек есть экспортированные функции. Запусти nm и убедись Вот, что показывает mc с его помощью (вроде):

                U _Unwind_Resume
                 U qFlagLocation(char const*)
                 U qt_message_output(QtMsgType, char const*)
                 U qFree(void*)
                 U qstrcmp(QByteArray const&, QByteArray const&)
                 U qWarning(char const*, ...)
000000000000b36e W qWarning()
                 U qCritical(char const*, ...)
000000000000ee0f W qCritical()
                 U qt_assert(char const*, char const*, int)
                 U operator delete(void*)
                 U QByteArray::shared_null
000000000000ae5a W QByteArray::data()
                 U QByteArray::clear()
                 U QByteArray::append(char const*, int)
                 U QByteArray::remove(int, int)
                 U QByteArray::realloc(int)
                 U QByteArray::operator=(char const*)
                 U QByteArray::operator=(QByteArray const&)

ziemin ★★
()
Ответ на: комментарий от monk

Ну еще Python таки более менее удобен, остальное думаю не очень. А так, GTK бы тоже могла быть норм, если бы не разработчики. Которые даже оформление каждый релиз ломают.

a1batross ★★★★★
()
Ответ на: комментарий от monk

Вопрос появился именно после просмотра указанного списка.

ну, к примеру, IDE для FPC - Lazarus имеет морду как раз на Qt, насчет PyQt педивикия пишет:

«Среди коммерческих пользователей PyQt можно отметить такие известные корпорации, как Disney, Dreamworks, Pixar, Industrial Light and Magic и Sony Pictures»

а есть еще PySide, например, не ручаюсь, что для всех ЯП есть такие примеры, но Qt используется не только в С++

wota ★★
()
Ответ на: комментарий от ziemin

Боюсь тебя разочаровать, но тут явно выхлоп nm -D -C.

nanoolinux ★★★★
()
Ответ на: комментарий от Stil

мог бы просто сказать: «на итаниуме»

Зачем мне это говорить?

In general, this document is written as a generic specification, to be usable by C++ implementations on a variety of architectures. However, it does contain processor-specific material for the Itanium 64-bit ABI, identified as such. Where structured data layout is described, we generally assume Itanium psABI member sizes. An implementation for a 32-bit ABI would typically just change the sizes of members as appropriate (i.e. pointers and long ints would become 32 bits), but sometimes an order change would be required for compactness, and we note more substantive changes.

generic specification, to be usable by C++ implementations on a variety of architectures

Что непонятно?

tailgunner ★★★★★
()
Ответ на: комментарий от nanoolinux

А кто его поддерживает?

Все Си++-компиляторы для Linux.

Дело в том, что в стандарте как не было, так и нет.

В стандарте Си++? Ну так в стандарте Си тоже нет ABI.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я правильно понял, что взяли просто gcc-шные правила и назвали это „правилами“? Я бы не стал говорить, что он не лишён недостатков. Например, очевидно, что для более скорого поиска в таблице имён в имени символа надо первыми ставить имена методов, потом классов, а потом пространств имён, а не наоборот.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Ответ на: комментарий от nanoolinux

Я правильно понял, что взяли просто gcc-шные правила и назвали это „правилами“?

Нет. ЕМНИП, Itanium C++ ABI, на основании которого был сделан GCC C++ ABI, был разработан Intel в рамках Monterey или чего-то такого.

Я бы не стал говорить, что он не лишён недостатков

Я думаю, что в рамках дискуссии это неважно. Стандарт есть, но он по очевидным причинам не поможет решить задачу «по-быстрому дернуть Qt».

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Ну для linux договорились и хорошо. Но это не считается общим стандартом, как в случае с теми же вызовами.

BRE ★★
()
Ответ на: комментарий от BRE

Но это не считается общим стандартом

Общим между чем и чем? ABI по определению зависит от платформы. Кстати, в старые времена на венде было 2 «стандарта» для Си++ ABI - от Microsoft и от Borland.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я говорю исключительно про манглинг имен. Давно можно было договориться и занести это в стандарт языка.

BRE ★★
()
Ответ на: комментарий от tailgunner

Кстати, в старые времена на венде было 2 «стандарта» для Си++ ABI - от Microsoft и от Borland.

Разве приложения, написанные в Borland не могли дергать нужные функции из библиотек MS VS? И обратно?

EXL ★★★★★
()
Ответ на: комментарий от EXL

Разве приложения, написанные в Borland не могли дергать нужные функции из библиотек MS VS?

Я не помню, как было дело с Си, но библиотеки Си++ были несовместимы.

tailgunner ★★★★★
()
Последнее исправление: tailgunner (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Общим между чем и чем?

Между поддерживаемыми Qt платформами очевидно. Иначе какая же это кроссплатформенность, если его использовать можно только из одного языка.

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Общим между чем и чем?

Между поддерживаемыми Qt платформами очевидно

какая же это кроссплатформенность, если его использовать можно только из одного языка

Что в твоем понимании «платформа»?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Не имеет значение ее сложность. :)

Я не согласился с твоим высказыванием про стандартизованный манглинг, он по сути не стандартизован для всего С++, есть какие-то договоренности на некоторых платформах, да и только.

BRE ★★
()
Ответ на: комментарий от wota

IDE для FPC - Lazarus имеет морду как раз на Qt

Я тут мимокрокодил, но морда у лазаруса написана на лазарусе и может компилироваться в любой поддерживаемый лазарусом тулкит. Дефолтом для линукса является gtk2, для винды win32/64 etc.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Я тут мимокрокодил, но морда у лазаруса написана на лазарусе и может компилироваться в любой поддерживаемый лазарусом тулкит. Дефолтом для линукса является gtk2

и таки имеет морду на Qt - все верно сказано, а насчет дефолта - у меня в репах есть два варианта - qt и gtk

wota ★★
()
Ответ на: комментарий от tailgunner

Что в твоем понимании «платформа»

Мне кидали вот это:

http://www.wikivs.com/wiki/GTK_vs_Qt#Portability

Вот и интересно, с точки зрения доступа из Perl/Ruby/Racket/... выигрываю ли я что-либо по сравнению с Gtk? Или только проигрываю (из-за костылей большего размера на windows)?

monk ★★★★★
() автор топика
Ответ на: комментарий от monk

Что в твоем понимании «платформа»

Мне кидали вот это:
http://www.wikivs.com/wiki/GTK_vs_Qt#Portability

Там под «платформой» подразумевается ОС; в таком случае ABI разный в пределах одной платформы (т.к. он зависит от архитектуры). Зачем ты приплел «кроссплатформенность» в претензию:

monk> какая же это кроссплатформенность, если его использовать можно только из одного языка

я просто не понимаю.

Вот и интересно, с точки зрения доступа из Perl/Ruby/Racket/... выигрываю ли я что-либо по сравнению с Gtk?

Нет. Правда, это не имеет отношения к факту существования Qt ABI. Для использования библиотеки нужны биндинги, а сделать их для Qt - дело сложное, потому что сама библиотека сложная и потому что Си++.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Для использования библиотеки нужны биндинги, а сделать их для Qt - дело сложное,

На самом деле не очень сложное (не сложнее, чем написать привязку к GObjectIntrospection). Есть QMetaClass — значит можно единообразно сгенерировать (или динамически формировать вызовы) ко всем полям и методам. https://github.com/ryanmelt/qtbindings/blob/master/lib/Qt/qtruby4.rb — 3200 строк на Ruby.

Основная проблема — отсутствие стандартного C API к этому метаклассу. Из-за чего каждый городит свой велосипед типа https://github.com/ryanmelt/qtbindings/tree/master/ext/ruby/qtruby/src — ещё более 4000 строк на С++, причём в зависимостях для биндинга тут же появляется gcc + куча заголовочных файлов, что сводит на нет удобство использования такого биндинга за пределами Линукса.

monk ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.