Как собирать приложеньица под 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собой благодарностью иемнно такие советы.Хотя за любое понятное мне решение поставленной мной задачи -- пиво/мороженное: бесплатная доставка по советскому району.
Для начала - вы уверены, что собираете именно этот код и именно такой командой? У вас там переменная используется до объявления. И пути неверные. И по скудной информации, предоставленной вами, складывается впечатление, что проблема у вас не в иксах, а в libc.С FreeBSD не особенно знаком, но что мешает вам собрать под разные версии системы разные бинарники чтобы избежать проблем с разными версиями библиотек (опять же, не знаю, какая libc используется в FreeBSD, но, к примеру, у glibc есть проблемы с запуском бинарника, собранного с другой версией)?
В общем, делайте всё последовательно и аккуратно, изучайте особенности и традиции среды, в которой работаете и вообще, изучайте матчасть и будет вам счастье.
>Как собирать приложеньица под X11, чтобы хотя бы в пределах FreeBSD --
>была "кросплатформенность" в бинарном виде. Желательно еще в виде одного файла,
>а не в виде вагончика библиотек. Но и с вагончиком можно
>(не проблема скрипт исталлятор написать).Линкуйте статически (хотя статические библиотеки для Qt, например, придется собирать руками) или таскайте с собой все библиотеки с той системы, на которой собирали, не забыв wrapper-скрипт с LD_LIBRARY_PATH="." .
Бинарная переносимость между ветками FreeBSD всегда была и есть, но, разумеется, только вверх (на ветки старше чем та, под которую был собран бинарник, надо ставить соответствующий compatNx пакет и COMPAT_FREEBSDx в ядро), и это совершенно не значит, что вы можете использовать хоть что-то из сторонних библиотек (т.е. из портов) на другой системе.
А вообще, в `диком мире юникс' никому нахрен не сдалось делать кроссплатформенные бинарники, потому что есть кроссплатформенные исходники.
На и кстати.>#define NIL (0) // A name for the void
Господь с вами, NULL. Не надо ничего дефайнить.
> int blackColor = BlackPixel(dpy, DefaultScreen(dpy));
> int whiteColor = WhitePixel(dpy, DefaultScreen(dpy));Используете dpy перед тем, как его объявить? Оригинально.