The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Как делать кроссплатформенные бинарники простых Х11 приложений?, !*! Lomik, 04-Окт-09, 15:56  [смотреть все]
Как собирать приложеньица под X11, чтобы хотя бы в пределах FreeBSD -- была "кросплатформенность" в бинарном виде. Желательно еще в виде одного файла, а не в виде вагончика библиотек. Но и с вагончиком можно (не проблема скрипт исталлятор написать).

В общем начал деятельность по прогамированию в диком мире юникс. До этого только в микроконтроллерах и чуть-чуть в виндах кодил. (одноверменно с этим начал новый концепт С++ вместо С, хотя ООП, изучаю системно, что нельзя сказать об технологии копиляции и граф. библиотек под Unix ).

Соотв. вcякие компиляции делаю либо доверяя навороченным средам типа Qt4, либо делая недо-осмысленные кальки и комбинации с этих калек найденные в гугле в примерах для разных UNIXов.

То, что собранное под qt4 в 7.2 не заработало 4.11, но заработало в 8.0... меня как бы и не удивило.

А вот то, что когда я с qt перешел на "голый" xlib, и что собранное под 4.11 не заработало в 7.2 -- удивало. Причем каждый раз (когда вписывал все требуемые lib*so*N)  "несовместимость" проявлялась ошибкой "Segmentation Fault \ Oшибка Сегментации"...

Прога (first.c)

#include <X11/Xlib.h> // Every Xlib program must include this
#include <unistd.h>   // So we got the profile for 10 seconds

#define NIL (0)       // A name for the void pointer
    
main()
{
      int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
      int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));
      Display *dpy = XOpenDisplay(NIL);
      Window w = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0,
                   200, 100, 0,
                   CopyFromParent, CopyFromParent, CopyFromParent,
                   NIL, 0);
      XMapWindow(dpy, w);
      XFlush(dpy);
      sleep(10);
}


собираю (недоосознавая что я точно делаю и как это можно сделать по другому)
сс -o -first.aut first.c -lX11 -L/usr/X6R11/lib -I /usr/X6R11/include

Бинарник, собравшийся под 7.2, в 4.11 в конце концов выдал:
Segmentation Fault
Собраное под 4.11 -- в 7.2 (потребовав всего одну библиотеку libc.so.4):
Ошибка сегментации

А чем и как собирать, чтобы без этой фигни?
Если и на навороченном Qt можно собрать так, чтобы запускалось в каких угодно X11 терминалах, оконных менеджерах (типа blackbox) на разных по древности FreeBSD, то приму c oсобой благодарностью иемнно такие советы.

Хотя за любое понятное мне решение поставленной мной задачи -- пиво/мороженное: бесплатная доставка по советскому району.

  • Как делать кроссплатформенные бинарники простых Х11 приложен..., !*! jd, 21:00 , 04-Окт-09 (1)
    Для начала - вы уверены, что собираете именно этот код и именно такой командой? У вас там переменная используется до объявления. И пути неверные. И по скудной информации, предоставленной вами, складывается впечатление, что проблема у вас не в иксах, а в libc.

    С FreeBSD не особенно знаком, но что мешает вам собрать под разные версии системы разные бинарники чтобы избежать проблем с разными версиями библиотек (опять же, не знаю, какая libc используется в FreeBSD, но, к примеру, у glibc есть проблемы с запуском бинарника, собранного с другой версией)?

    В общем, делайте всё последовательно и аккуратно, изучайте особенности и традиции среды, в которой работаете и вообще, изучайте матчасть и будет вам счастье.

  • Как делать кроссплатформенные бинарники простых Х11 приложен..., !*! аноним, 19:35 , 06-Окт-09 (2)
    >Как собирать приложеньица под X11, чтобы хотя бы в пределах FreeBSD --
    >была "кросплатформенность" в бинарном виде. Желательно еще в виде одного файла,
    >а не в виде вагончика библиотек. Но и с вагончиком можно
    >(не проблема скрипт исталлятор написать).

    Линкуйте статически (хотя статические библиотеки для Qt, например, придется собирать руками) или таскайте с собой все библиотеки с той системы, на которой собирали, не забыв wrapper-скрипт с LD_LIBRARY_PATH="." .

    Бинарная переносимость между ветками FreeBSD всегда была и есть, но, разумеется, только вверх (на ветки старше чем та, под которую был собран бинарник, надо ставить соответствующий compatNx пакет и COMPAT_FREEBSDx в ядро), и это совершенно не значит, что вы можете использовать хоть что-то из сторонних библиотек (т.е. из портов) на другой системе.

    А вообще, в `диком мире юникс' никому нахрен не сдалось делать кроссплатформенные бинарники, потому что есть кроссплатформенные исходники.

  • Как делать кроссплатформенные бинарники простых Х11 приложен..., !*! аноним, 19:38 , 06-Окт-09 (3)
    На и кстати.

    >#define NIL (0)    // A name for the void

    Господь с вами, NULL. Не надо ничего дефайнить.

    >   int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
    >   int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));

    Используете dpy перед тем, как его объявить? Оригинально.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру