Quantcast

Re: Вопрос по SPF 4.20 for Linux

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

Мохов Геннадий
Здравствуйте.

Я пытаюсь написать небольшую (для внутреннего использования) кросплатформенную библиотеку для SPF 4.20. Эта библиотека предоставляет «обёртки» вызовов графической библиотеки QT.  

В этой ветке форума я пытался получить некоторые ответы http://fforum.winglion.ru/viewtopic.php?f=4&t=2674

Проблема:
     Хочу иметь унифицированный набор вызовов (одинаково работающий в SPF 4.20 и в Win и Linux) таких как:
        CDECL-CALL
      PASCAL-CALL
    STDCALL-CALL
       WINAPI-CALL
            FAST-CALL
            SAFE-CALL
THIS-CDECL-CALL
 и т.д. (я не владеют ассемблером)

Для SPF-Win мне  удалось осуществить вызов
    STDCALL-CALL
        CDECL-CALL
THIS-CDECL-CALL  примеры в форуме (см. выше).

а вот в SPF-Linux вызов CDECL-CALL работает частично. В частности не работает
прямой вызов. Пример:

Не работает
: show    Адр_Функ_Show  CDECL-CALL ;
....
show

Работает:
  .........
: show    Адр_Функ_Show  ;

............

aQWidget show CDECL-CALL

При попытке трассировки под gdb удалось получить сообщение: Стековый фрейм внутри фрейма.  Толи не хватает сохранения какого то регистра, то ли  рекурсия возникает, не понятно.  :-(

В качестве более подробного примера можно рассмотреть текст графической консоли http://fforum.winglion.ru/viewtopic.php?f=4&t=2674&start=60  для SPF-Linux который везде использует вызов типа:

 aQWidget show CDECL-CALL   \ а внести вызов в метод (функцию) == ошибка сегментации

думаю, что как следствие не работает вызов THIS-CDECL-CALL. Работа с этим вызовом
проходит под SPF-Win (нужна для вызова методов QT напрямую из QtGui и т.д.)
 
В архиве для Win файл f++.f демонстрирует проблему вызова THIS-CDECL-CALL.

Исходники для Winows: http://mgw.narod.ru/spfqt_win.zip 
Исходники для Linux: http://mgw.narod.ru/spfqt_linux.zip

Вот, наверное слишком много вопросов, но хотя бы понять направление поиска.

Заранее благодарен за ответ.

Мохов Геннадий Владимирович
http://mgw.narod.ru/about.htm

------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

Andrey Cherezov
Re: [Spf-dev] Вопрос по SPF 4.20 for Linux

Добрый день!

Тут можно обойтись без ассемблера, я думаю. Для вызова внешней сишной функции достаточно перенести её параметры на стек возвратов и выполнить EXECUTE (впервые применено Михаилом Максимовым в варианте SPF с "загрузчиком" на Си - где-то в 2005м году). См. ~ac/lib/ns/ns.f, so-xt.f, dll-xt.f и массу примеров кроссплатформенного (двухплатформенного :)  использования оных в ~ac/lib/lin/. Не встречал ни одной *.dll или *.so, с которыми бы это не работало. Правда плюс-плюснутые so не испытывал, но там, если я правильно понимаю, отличие только в изуродаванных сигнатурами методов именах функций, но не в самом принципе вызова. С именами вы, насколько я вижу (по ??0QApplication@@QAE@AAHPAPAD@Z и т.п.) уже разобрались. Значит всё должно работать.

P.S. В ваших примерах не хватает упомянутого там файла args.f.


-------- Исходное сообщение --------
Тема: Re: [Spf-dev] Вопрос по SPF 4.20 for Linux
Дата: 2010-12-15 14:25:26
От: [hidden email]

Здравствуйте.

Я пытаюсь написать небольшую (для внутреннего использования) кросплатформенную библиотеку для SPF 4.20. Эта библиотека предоставляет «обёртки» вызовов графической библиотеки QT.

В этой ветке форума я пытался получить некоторые ответы http://fforum.winglion.ru/viewtopic.php?f=4&t=2674

Проблема:
Хочу иметь унифицированный набор вызовов (одинаково работающий в SPF 4.20 и в Win и Linux) таких как:
CDECL-CALL
PASCAL-CALL
        STDCALL-CALL
WINAPI-CALL
FAST-CALL
SAFE-CALL
THIS-CDECL-CALL
и т.д. (я не владеют ассемблером)

Для SPF-Win мне удалось осуществить вызов
        STDCALL-CALL
CDECL-CALL
THIS-CDECL-CALL примеры в форуме (см. выше).

а вот в SPF-Linux вызов CDECL-CALL работает частично. В частности не работает прямой вызов. Пример:

Не работает
: show Адр_Функ_Show CDECL-CALL ;
.... show

Работает:
    .........
: show Адр_Функ_Show ;

............

aQWidget show CDECL-CALL

При попытке трассировки под gdb удалось получить сообщение: Стековый фрейм внутри фрейма. Толи не хватает сохранения какого то регистра, то ли рекурсия возникает, не понятно.

В качестве более подробного примера можно рассмотреть текст графической консоли http://fforum.winglion.ru/viewtopic.php?f=4&t=2674&start=60 для SPF-Linux который везде использует вызов типа:

aQWidget show CDECL-CALL \ а внести вызов в метод (функцию) == ошибка сегментации

думаю, что как следствие не работает вызов THIS-CDECL-CALL. Работа с этим вызовом проходит под SPF-Win (нужна для вызова методов QT напрямую из QtGui и т.д.)

В архиве для Win файл f++.f демонстрирует проблему вызова THIS-CDECL-CALL.

Исходники для Winows: http://mgw.narod.ru/spfqt_win.zip
Исходники для Linux: http://mgw.narod.ru/spfqt_linux.zip

Вот, наверное слишком много вопросов, но хотя бы понять направление поиска.

Заранее благодарен за ответ.

Мохов Геннадий Владимирович
http://mgw.narod.ru/about.htm


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

ygrek-3
Привет,

 У c++ другой convention вызова. Более того, у c++ вообще
нету стандартного abi (в отличие от cи), поэтому даже на плюсах простым способом вызвать напрямую метод из
динамической библиотеки слинкованной другим компилятором не получится. Поэтому для вызова c++ методов из форта
придётся затачиваться под каждый компилятор отдельно, и под настройки с которыми была собрана библиотека (!).
SPF поддерживает стандартные форматы вызовов - stdcall (winapi) и cdecl, но нестандартные (реализованные
в каждом компиляторе по-разному) поддерживать сложно :), но возможно - просто будет не один thiscall, а скажем
thiscall-msvc и thiscall-gcc :))
Я бы начал с простой плюсовой библиотеки с одним методом собранной самостоятельно (чтобы контроллировать все настройки)
и пробовать с разными компиляторами с минимумом кода на форт-стороне чтобы проще было ловить ошибки.

Вот например быстрый поиск даёт - http://www.programmersheaven.com/2/Calling-conventions

PS: Андрей, ты кстати получал моё письмо насчёт ssl сертификата для почты forth.org.ru?

--
 ~ygrek


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

Andrey Cherezov
Re: [Spf-dev] Вопрос по SPF 4.20 for Linux

У c++ другой convention вызова. Более того, у c++ вообще нету стандартного abi (в отличие от cи), поэтому даже на плюсах простым способом вызвать напрямую метод из динамической библиотеки слинкованной другим компилятором не получится. Поэтому для вызова c++ методов из форта придётся затачиваться под каждый компилятор отдельно,

Не знаю, какие это вызовет сложности под линуксом (там ведь всего один компилятор плюсов), не приходилось пробовать. А под виндой я приплюснутые либы подключал без проблем (если не считать уродских имен функций). Например, байесова библиотека libsd в Eserv использует приплюснутый API - например такая функция "?sd_classify@@YAHHPBEW4__enum_sd_classify_options@@PAU__struct_sd_why@@@Z" :) - но я её подключаю обычным способом "ALSO SO NEW: libsd.dll", все работает нормально уже несколько лет. До неё бывали и другие подобные. После COM это всё мелочи :)

PS: Андрей, ты кстати получал моё письмо насчёт ssl сертификата для почты forth.org.ru?

Получал.


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

ygrek-3
On Sun, 19 Dec 2010 08:13:44 +0300
Andrey Cherezov <[hidden email]> wrote:

> Не знаю, какие это вызовет сложности под линуксом (там ведь всего один компилятор плюсов), не приходилось пробовать. А под виндой я приплюснутые либы подключал без проблем (если не считать уродских имен функций). Например, байесова библиотека libsd в Eserv использует приплюснутый API - например такая функция "?sd_classify@@YAHHPBEW4__enum_sd_classify_options@@PAU__struct_sd_why@@@Z" :) - но я её подключаю обычным способом "ALSO SO NEW: libsd.dll", все работает нормально уже несколько лет. До неё бывали и другие подобные. После COM это всё мелочи :)

Если я правильно раздеманглил имя :) то это глобальная функция, т.е. по умолчанию cdecl, проблемы же именно с вызовом методов объектов.

--
 ~ygrek


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

Roman =Balancer= Karshiev-2
In reply to this post by Andrey Cherezov
Andrey Cherezov <[hidden email]> писал(а) в своём письме Sun,  
19 Dec 2010 08:13:44 +0300:

> Не знаю, какие это вызовет сложности под линуксом (там ведь всего один
> компилятор плюсов)

Только из популярных - GCC, ICC, LLVM :)

--
Написано в почтовом клиенте браузера Opera: http://www.opera.com/mail/
------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: Вопрос по SPF 4.20 for Linux

Andrey Cherezov
Re: [Spf-dev] Вопрос по SPF 4.20 for Linux

Привет!

Да в курсе, что их существует масса. А я говорю о реально используемых.

Под виндой практически весь открытый софт затачивают на ДВА компилятора - MSVC и GCC. Под линуксом на ОДИН GCC. Вариации в единицы процентов только подтверждают это правило ;)

Думаю, что если линковщик плюсплюснутых либ для SPF будет поддерживать только GCC, то это решит 99.9% проблем пользователей оных либ на обеих ОС. Тем более что речь у исходновопрошающего шла пока только про QT, и можно вообще не думать о глобальных отмазках, а изучать пока только abi конкретных готовых qt dll/so.


-------- Исходное сообщение --------
Тема: Re: [Spf-dev] Вопрос по SPF 4.20 for Linux
Дата: 2010-12-19 17:51:31
От: [hidden email]

Andrey Cherezov писал(а) в своём письме Sun,
19 Dec 2010 08:13:44 +0300:

Не знаю, какие это вызовет сложности под линуксом (там ведь всего один
компилятор плюсов)
Только из популярных — GCC, ICC, LLVM


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Spf-dev mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/spf-dev
Loading...