URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8461
[ Назад ]

Исходное сообщение
"Как делать кроссплатформенные бинарники простых Х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 , 04-Окт-09 21:00 
Для начала - вы уверены, что собираете именно этот код и именно такой командой? У вас там переменная используется до объявления. И пути неверные. И по скудной информации, предоставленной вами, складывается впечатление, что проблема у вас не в иксах, а в libc.

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

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


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

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

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

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


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

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

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

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

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