Форум программистов, компьютерный форум CyberForum.ru

Qt

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 183, средняя оценка - 4.78
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
#1

GNU/Linux Qt5.* - Линкуем статически - C++ Qt

23.01.2014, 19:10. Просмотров 27596. Ответов 57
Метки нет (Все метки)

В связи с отсутствием в данной теме мануала по статической линковке приложений Qt, решил исправить данный недостаток
Оговорюсь сразу: приветствуется беспощадная критика, особенно, что касается скриптов)
Итак:
1) Как обычно, нужно пересобрать фреймвор статически. Для этого скачиваем архив с исходными текстами отсюда: http://qt-project.org/downloads
На данный момент имя тар-бола - qt-everywhere-opensource-src-5.2.0.tar.gz

2) Переходим в каталог с тар-болом. Разархивируем и распаковываем. Потом нужно сконфигурировать, собрать и установить тонну исходников. Делаем это так ( за дополнительными параметрами, если нужно, обращайтесь ./configure --help):
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
tar -xzvf qt-everywhere-opensource-src-5.2.0.tar.gz && cd qt-everywhere-opensource-src-5.2.0 \
&& sudo mkdir -p /usr/lib/Qt5_static && ./configure -platform linux-g++ \
-release \
-static \
-fontconfig \
-opensource \
-confirm-license \
-nomake examples \
-c++11 \
-nomake tests \
-qt-zlib \
-qt-libpng \
-qt-libjpeg \
-prefix /usr/local/Qt5_static \
&& make -j3 && make install
Код
Объяснение опций:
-platform linux-g++ \ # Ваша платформа и компилятор
-release \ # Собираем для релиза
-static \ # Собственно, наша цель собрать статически
-fontconfig \ # Поддержка собственного fontconfig
-opensource \ # СПО версия
-confirm-license \ # Сразу согласиться с лицензией
-nomake examples \ # Не собирать учебные примеры
-c++11 \ # Поддержка последнего стандарта
-nomake tests \ # Не проводить тесты
-qt-zlib \ # Внедрение собственной библиотеки <libname>
-qt-libpng \ # ...
-qt-libjpeg \ # ...
-prefix /usr/local/Qt5_static \ # Относительно этого пути будет производиться установка (можете свой указать)
make -j3 # количество ядер процессора +1
3) Так, теперь у нас есть все необходимые инструменты (почти )
Заходим в QtCreator, Tools > Options > Build & Run > Qt Versions
Добавляем путь к новому qmake ( в нашем случае /usr/local/Qt5_static/bin/qmake ).
Затем идем на вкладку Kits и добавляем новый набор инструментов, только укзываем ему qmake, только что добавленный на предыдущем шаге. Озаглавим этот набор Qt5_staticKit, например. Нажимаем Ok.
4) Ctrl+5, выбираем вверху проект, который мы хотим собрать статически, и щелкаем по новому Kit'y Qt5_staticKit. Выбираем Release конфигурацию. Тааак, здесь пока все.
5) Перелазим в .pro file. Добавляем туда
Код
QMAKE_LFLAGS += -s # Убрать все таблицы символов из результирующего бинарника ( man gcc )
# 3-rd party библиотеки, (boost, gmp, ... ) если есть статический вариант добавляем так:
LIBS += -Wl, -Bstatic, -lboost_regex, -lgmp, -lgmpxx, -Bdynamic
Теперь все Qt и 3-rd party библиотеки сидят в бинарнике, НО дело еще не закончено.
Если посмотреть на вывод ldd, то можно увидеть, что приложение зависит еще от целой кучи не Qt-ных библиотек. Они могут быть бинарно-несовместимыми со своими предыдущими версиями (особенно, если написаны на С++) даже если они имеются на чужом компьютере.
Например:
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
ldd traditional
        linux-vdso.so.1 (0x00007fffd05fe000)
        libgobject-2.0.so.0 => lib/libgobject-2.0.so.0 (0x00007fe1a298a000)
        libX11-xcb.so.1 => lib/libX11-xcb.so.1 (0x00007fe1a2788000)
        libXi.so.6 => lib/libXi.so.6 (0x00007fe1a2578000)
        libxcb-render-util.so.0 => lib/libxcb-render-util.so.0 (0x00007fe1a2375000)
        libSM.so.6 => lib/libSM.so.6 (0x00007fe1a216d000)
        libICE.so.6 => lib/libICE.so.6 (0x00007fe1a1f51000)
        libxcb-glx.so.0 => lib/libxcb-glx.so.0 (0x00007fe1a1d39000)
        libxcb-render.so.0 => lib/libxcb-render.so.0 (0x00007fe1a1b2f000)
        libxcb-keysyms.so.1 => lib/libxcb-keysyms.so.1 (0x00007fe1a192d000)
        libdbus-1.so.3 => lib/libdbus-1.so.3 (0x00007fe1a16e5000)
        libxcb.so.1 => lib/libxcb.so.1 (0x00007fe1a14c5000)
        libxcb-image.so.0 => lib/libxcb-image.so.0 (0x00007fe1a12c1000)
        libxcb-icccm.so.4 => lib/libxcb-icccm.so.4 (0x00007fe1a10bd000)
        libxcb-sync.so.1 => lib/libxcb-sync.so.1 (0x00007fe1a0eb7000)
        libxcb-xfixes.so.0 => lib/libxcb-xfixes.so.0 (0x00007fe1a0cb0000)
        libxcb-shm.so.0 => lib/libxcb-shm.so.0 (0x00007fe1a0aad000)
        libxcb-randr.so.0 => lib/libxcb-randr.so.0 (0x00007fe1a089f000)
        libxcb-shape.so.0 => lib/libxcb-shape.so.0 (0x00007fe1a069b000)
        libxcb-xkb.so.1 => lib/libxcb-xkb.so.1 (0x00007fe1a0480000)
        libxkbcommon.so.0 => lib/libxkbcommon.so.0 (0x00007fe1a0220000)
        libfontconfig.so.1 => lib/libfontconfig.so.1 (0x00007fe19ffe4000)
        libfreetype.so.6 => lib/libfreetype.so.6 (0x00007fe19fd3f000)
        libXrender.so.1 => lib/libXrender.so.1 (0x00007fe19fb35000)
        libXext.so.6 => lib/libXext.so.6 (0x00007fe19f923000)
        libX11.so.6 => lib/libX11.so.6 (0x00007fe19f5e8000)
        libudev.so.1 => lib/libudev.so.1 (0x00007fe19f3d6000)
        libicui18n.so.52 => lib/libicui18n.so.52 (0x00007fe19efce000)
        libicuuc.so.52 => lib/libicuuc.so.52 (0x00007fe19ec55000)
        libpcre16.so.0 => lib/libpcre16.so.0 (0x00007fe19e9f6000)
        libdl.so.2 => lib/libdl.so.2 (0x00007fe19e7f2000)
        libgthread-2.0.so.0 => lib/libgthread-2.0.so.0 (0x00007fe19e5f0000)
        libglib-2.0.so.0 => lib/libglib-2.0.so.0 (0x00007fe19e2f0000)
        librt.so.1 => lib/librt.so.1 (0x00007fe19e0e8000)
        libGL.so.1 => lib/libGL.so.1 (0x00007fe19ddb5000)
        libpthread.so.0 => lib/libpthread.so.0 (0x00007fe19db98000)
        libstdc++.so.6 => lib/libstdc++.so.6 (0x00007fe19d894000)
        libm.so.6 => lib/libm.so.6 (0x00007fe19d591000)
        libgcc_s.so.1 => lib/libgcc_s.so.1 (0x00007fe19d37b000)
        libc.so.6 => lib/libc.so.6 (0x00007fe19cfd1000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fe1a2bdb000)
        libpcre.so.1 => lib/libpcre.so.1 (0x00007fe19cd6a000)
        libffi.so.6 => lib/libffi.so.6 (0x00007fe19cb62000)
        libuuid.so.1 => lib/libuuid.so.1 (0x00007fe19c95d000)
        libXau.so.6 => lib/libXau.so.6 (0x00007fe19c759000)
        libXdmcp.so.6 => lib/libXdmcp.so.6 (0x00007fe19c553000)
        libxcb-util.so.1 => lib/libxcb-util.so.1 (0x00007fe19c34e000)
        libexpat.so.1 => lib/libexpat.so.1 (0x00007fe19c124000)
        libz.so.1 => lib/libz.so.1 (0x00007fe19bf0e000)
        libbz2.so.1.0 => lib/libbz2.so.1.0 (0x00007fe19bcfe000)
        libpng16.so.16 => lib/libpng16.so.16 (0x00007fe19bac9000)
        libicudata.so.52 => lib/libicudata.so.52 (0x00007fe19a25e000)
        libnvidia-tls.so.331.38 => lib/libnvidia-tls.so.331.38 (0x00007fe19a05b000)
        libnvidia-glcore.so.331.38 => lib/libnvidia-glcore.so.331.38 (0x00007fe19784d000)

Пересобирать каждую из них, в случае, когда нет статической, довольно проблематично и долго и не всегда возможно ( кто хочет пусть попробует ), поэтому есть вариант поставлять их вместе со своим приложением. Большая вероятность того, что большинство этих библиотек будут на чужой машине, но выполнив еще немного действий, вы застрахуете и себя, и пользователя от лишней головной боли.
Вот что делаем:
1) Нужно скопировать симлинк, который выводит ldd, и библиотеку на которую он указывает в каталог с нашим приложением. ( в нашем случае /path/to/app/lib ). Симлинк использует динамический загрузчик при загрузке библиотеки для приложения во время выполнения, ну а библиотека, на которую он указывает это собственно данные.

Вот наваял такой скрипт (еще раз напомню, что правки и улучшения очень приветствуются c башем знаком 2 дня )

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/sh
LIB_DIR=lib/
SONAME_LIST=soname.lst
 
if [ "$#" -lt 1 ]; then
    echo "Usage: ./$(basename ${0}) < executable >"
    exit 1;
fi
 
# slc.c: На входе - вывод ldd, на выходе - имена symlink'ов, для динамич. загрузчика
cat<<'EOF' > slc.c
    #include <stdio.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <locale.h>
    #include <string.h>
 
    #define MAX_LENGTH 256
    #define LINE_CNT 200
    int first_nonspace(const char *s) {
    for(size_t i=0; *s; ++i, ++s)
        if( !isspace(*s) )
        return i;
    return -1; // Нет значимых символов
    }
    int main() {
    setlocale(LC_ALL, "C");
    char** lines = malloc( LINE_CNT * sizeof(char*) );
    for(int i=0; i < LINE_CNT; ++i)
        lines[i] = malloc( MAX_LENGTH * sizeof(char) );
    char  line[MAX_LENGTH];
    size_t currLineNumb = 0;
 
    while( fgets(line, MAX_LENGTH, stdin) != NULL && currLineNumb < LINE_CNT) {
        int fns = first_nonspace(line);
        if(fns == -1)
        continue;
        else {
        char lib_prefix[4] = {'\0',}; // "lib" + '\0'
        strncpy(lib_prefix, line+fns, 3);
        lib_prefix[3] = '\0';
        if( !strcmp(lib_prefix, "lib")) // Если имя начинается с 'lib',
            strcpy(lines[currLineNumb++], line+fns); // сохраняем эту строчку
        }
    }
    // Выводим сохраненную строчку до первого пробела,
    // что и будет составлять наш soname.
    for(size_t i=0; i < currLineNumb; ++i)
        printf("%.*s\n", (int)(strchr(lines[i], ' ') - lines[i]), lines[i]);
    for(int i=0; i < LINE_CNT; ++i) free(lines[i]);
    free(lines);
    return 0;
    }
EOF
cc -std=c99 slc.c -o slc
mkdir -p ${LIB_DIR}
ldd $1 | ./slc > $SONAME_LIST
for name in `cat $SONAME_LIST`; do
    libname=$(readlink /usr/lib/$name)   # Получим имя библиотеки
    cp /usr/lib/${libname} -t $LIB_DIR;    # Копируем библиотеку
    cp -P /usr/lib/${name} -t $LIB_DIR;    # Копируем симлинк, нужный для ldd
done
 
# Чистимся
rm -f ${SONAME_LIST} slc{,.c}
exit 0;
Сохраняем это под именем, например, s.sh, и ложим в каталог с исполняемым файлом приложения.
Выполняем:
Bash
1
chmod +x s.sh && ./s.sh name_of_the_executable
В текущем каталоге появится каталог ./lib/ , в котором будут лежать все необходимые ссылки и библиотеки.
Последний штрих: в .pro файл нужно добавить -rpath опцию линковщику, чтобы загрузчик потом знал, что поставляемые нами вместе с приложением библиотеки лежат в папке lib/ (в данном случае):
Код
LIBS += -Wl,-rpath lib/
Теперь все это дело в .tar.gz и можете делиться с друзьями своим приложением

Как из этого сделать программный пакет, смотрите документацию к своему дистрибутиву GNU/Linux.

Ps. На MacOS процедура практически не должна отличаться, но у меня нет возможности проверить.
Pss. Если ваше приложени базируется на плагинах, то они по своей природе не могут линковаться статически..
Смотрите документацию http://qt-project.org/doc/qt-4.8/deployment-x11.html и все вытекающие перекрестные ссылки по плагинам.
___________________________________________________________________________________________________________
Вроди бы ничего не забыл...
Надеюсь, статейка кому-нибудь поможет разобраться.
Спасибо и удачи
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
29.12.2014, 11:28     GNU/Linux Qt5.* - Линкуем статически #21
Есть тут кто живой?
8Observer8
1463 / 901 / 114
Регистрация: 05.10.2013
Сообщений: 3,179
Записей в блоге: 54
08.01.2015, 13:28     GNU/Linux Qt5.* - Линкуем статически #22
Выглядит сложно. Пока не вчитывался. Вот здесь выглядит проще: http://help.ubuntu.ru/wiki/qt_static Пока не пробовал
8Observer8
1463 / 901 / 114
Регистрация: 05.10.2013
Сообщений: 3,179
Записей в блоге: 54
12.01.2015, 15:51     GNU/Linux Qt5.* - Линкуем статически #23
Помогите, пожалуйста, очень нужна помощь. Пытаюсь собрать Qt статически на Linux Mint 13 по этой инструкции: http://help.ubuntu.ru/wiki/qt_static

Вот мои шаги. Поставил Mint. Ввёл команду:

sudo apt-get install build-essential ^libxcb.* libx11-xcb-dev libglu1-mesa-dev libxrender-dev libfontconfig1-dev
Ввожу команду конфигурирования:
./configure -prefix "/home/ivan/Qt5.4.0_Static" -static -platform linux-g++ -release -opensource -confirm-license -fontconfig -no-compile-examples -nomake examples -nomake tests -nomake tools -opengl desktop -qt-sql-sqlite -make libs -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype
Результат конфигурирования:

Configure summary

Build type: * *linux-g++ (i386, CPU features: none detected)

Build options:
*Configuration .......... accessibility accessibility-atspi-bridge audio-backend avx c++11 clock-gettime clock-monotonic concurrent evdev eventfd fontconfig full-config getaddrinfo getifaddrs gif harfbuzz iconv inotify ipv6ifname jpeg large-config largefile linuxfb medium-config minimal-config mremap nis opengl pcre png posix_fallocate precompile_header qpa qpa reduce_exports reduce_relocations release rpath small-config sse2 sse3 sse4_1 sse4_2 ssse3 static system-freetype xcb xcb-glx xcb-plugin xcb-render xcb-xlib xkbcommon-qt xlib xrender zlib
*Build parts ............ *libs
*Mode ................... release
*Using C++11 ............ yes
*Using gold linker....... no
*Using PCH .............. yes
*Target compiler supports:
* *SSE2/SSE3/SSSE3 ...... yes/yes/yes
* *SSE4.1/SSE4.2 ........ yes/yes
* *AVX/AVX2 ............. yes/no

Qt modules and options:
*Qt D-Bus ............... runtime
*Qt Concurrent .......... yes
*Qt GUI ................. yes
*Qt Widgets ............. yes
*Large File ............. yes
*QML debugging .......... yes
*Use system proxies ..... no

Support enabled for:
*Accessibility .......... yes
*ALSA ................... no
*CUPS ................... no
*Evdev .................. yes
*FontConfig ............. yes
*FreeType ............... yes (system library)
*Glib ................... no
*GTK theme .............. no
*HarfBuzz ............... yes (bundled copy)
*Iconv .................. yes
*ICU .................... no
*Image formats:
* *GIF .................. yes (in QtGui, using bundled copy)
* *JPEG ................. yes (in QtGui, using bundled copy)
* *PNG .................. yes (in QtGui, using bundled copy)
*journald ............... no
*mtdev .................. no
*Networking:
* *getaddrinfo .......... yes
* *getifaddrs ........... yes
* *IPv6 ifname .......... yes
* *OpenSSL .............. no
*NIS .................... yes
*OpenGL / OpenVG:
* *EGL .................. no
* *OpenGL ............... desktop
* *OpenVG ............... no
*PCRE ................... yes (bundled copy)
*pkg-config ............. yes
*PulseAudio ............. no
*QPA backends:
* *DirectFB ............. no
* *EGLFS ................ no
* *KMS .................. no
* *LinuxFB .............. yes
* *XCB .................. yes (system library)
* * *EGL on X ........... no
* * *GLX ................ yes
* * *MIT-SHM ............ yes
* * *Xcb-Xlib ........... yes
* * *Xcursor ............ yes (loaded at runtime)
* * *Xfixes ............. yes (loaded at runtime)
* * *Xi ................. yes (loaded at runtime)
* * *Xi2 ................ no
* * *Xinerama ........... yes (loaded at runtime)
* * *Xrandr ............. yes (loaded at runtime)
* * *Xrender ............ yes
* * *XKB ................ no
* * *XShape ............. yes
* * *XSync .............. yes
* * *XVideo ............. yes
*Session management ..... yes
*SQL drivers:
* *DB2 .................. no
* *InterBase ............ no
* *MySQL ................ no
* *OCI .................. no
* *ODBC ................. no
* *PostgreSQL ........... no
* *SQLite 2 ............. no
* *SQLite ............... qt-qt
* *TDS .................. no
*udev ................... no
*xkbcommon .............. yes (bundled copy, XKB config root: /usr/share/X11/xkb)
*zlib ................... yes (bundled copy)


WARNING: Using static linking will disable the use of dynamically
loaded plugins. Make sure to import all needed static plugins,
or compile needed modules into the library.
Info: creating super cache file /home/ivan/Qt5.4.0/5.4/Src/.qmake.super

Qt is now configured for building. Just run 'make'.
Once everything is built, you must run 'make install'.
Qt will be installed into /home/ivan/Qt5.4.0_Static

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.
Ввожу команду make и через 20 минут получаю ошибку: "Project ERROR: Unknown module(s) in QT: dbus"

rm -f ../../lib/libQt5Gui.a
mv -f libQt5Gui.a ../../lib/
make[3]: Leaving directory `/home/ivan/Qt5.4.0/5.4/Src/qtbase/src/gui'
cd platformheaders/ && ( test -e Makefile || /home/ivan/Qt5.4.0/5.4/Src/qtbase/bin/qmake /home/ivan/Qt5.4.0/5.4/Src/qtbase/src/platformheaders/platformheaders.pro -o Makefile ) && make -f Makefile
make[3]: Entering directory `/home/ivan/Qt5.4.0/5.4/Src/qtbase/src/platformheaders'
make[3]: Nothing to be done for `first'.
make[3]: Leaving directory `/home/ivan/Qt5.4.0/5.4/Src/qtbase/src/platformheaders'
cd platformsupport/ && ( test -e Makefile || /home/ivan/Qt5.4.0/5.4/Src/qtbase/bin/qmake /home/ivan/Qt5.4.0/5.4/Src/qtbase/src/platformsupport/platformsupport.pro -o Makefile ) && make -f Makefile
Project ERROR: Unknown module(s) in QT: dbus
make[2]: *** [sub-platformsupport-make_first] Error 3
make[2]: Leaving directory `/home/ivan/Qt5.4.0/5.4/Src/qtbase/src'
make[1]: *** [sub-src-make_first] Error 2
make[1]: Leaving directory `/home/ivan/Qt5.4.0/5.4/Src/qtbase'
make: *** [module-qtbase-make_first] Error 2
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 13:36     GNU/Linux Qt5.* - Линкуем статически #24
Как отучить проекты требовать QTшный шрифт?
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 13:44     GNU/Linux Qt5.* - Линкуем статически #25
Цитата Сообщение от KOSHAK_ Посмотреть сообщение
QTшный шрифт?
Что?!
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 13:46     GNU/Linux Qt5.* - Линкуем статически #26
При запуске на другом компе, где нет Qt, программа просит папку fonts из папки с Qt библиотеками (при запуске через терминал). Если по тому пути, что указан в ошибке положить папку fonts, то программа запускается
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 13:50     GNU/Linux Qt5.* - Линкуем статически #27
Какая версия Qt и ОС? У Qt нет "своих" шрифтов, по этому и требовать он ничего не может.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 13:54     GNU/Linux Qt5.* - Линкуем статически #28
Qt 5.3.2, ОС kUbuntu 14.10. Папка, которую он требует, лежит по адресу: /usr/local/Qt5_static/lib/fonts
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 14:05     GNU/Linux Qt5.* - Линкуем статически #29
Видимо не верно собрано, так как не должно быть такой папки, у меня ее нет ни в статике, ни в динамике.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 14:25     GNU/Linux Qt5.* - Линкуем статически #30
Да все точно по инструкции, часа полтора-два все это дело собиралось и устанавливалось. Компилирую в конфигурации Release. Может где-то в Qt Creator надо настройки изменить?
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 15:00     GNU/Linux Qt5.* - Линкуем статически #31
Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Может где-то в Qt Creator надо настройки изменить?
Он тут вообще не при чем.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 15:04     GNU/Linux Qt5.* - Линкуем статически #32
А как тогда исправить? Отличия от инструкции заключались только в том, что пришлось использовать команду sudo, без нее выскакивали ошибки еще на стадии ./configure.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 15:16     GNU/Linux Qt5.* - Линкуем статически #33
Цитата Сообщение от KOSHAK_ Посмотреть сообщение
что пришлось использовать команду sudo
Она не нужна. Вы что-то делали не так.

Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Отличия от инструкции
какой инструкции?
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 15:21     GNU/Linux Qt5.* - Линкуем статически #34
Инструкция из этой темы, первое сообщение. Я уже описывал проблему ранее:

Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Никак не получается собрать библиотеки. Выскакивает ошибка:

Код
Running configuration tests...
The test for linking against libxcb and support libraries failed!
*You might need to install dependency packages, or pass -qt-xcb.
*See src/plugins/platforms/xcb/README.
Пробовал добавлять ключ -qt-xcb, выдало:

Код
NOTE: libxkbcommon and libxkbcommon-x11 0.4.1 or higher not found on the system, will use 
the bundled version from 3rd party directory.
Could not find qmake configuration file linux-g++.
Error processing project file: /home/oleg/Загрузки/qt-everywhere-opensource-src-5.3.2/qt.pro
Без sudo она не собирается. Сделать что-то НЕ так я точно не мог, скачал, распаковал в папку через терминал, запустил команду ./configure со всеми флагами из инструкции, запустил make / make install. Ошибиться там невозможно.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 15:42     GNU/Linux Qt5.* - Линкуем статически #35
KOSHAK_, если у вас кубунта, то нужно зависимости сборки установить как в примерах выше:
Bash
1
sudo apt-get install build-essential ^libxcb.* libx11-xcb-dev libglu1-mesa-dev libxrender-dev libfontconfig1-dev
Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Сделать что-то НЕ так я точно не мог
Ну раз у вас не работает - значит могли. Сборка Qt из сорцов не самая тривиальная задача.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 16:26     GNU/Linux Qt5.* - Линкуем статически #36
Так там всего 3 команды...
Собрал библиотеки под виртуалкой,но на kUbuntu x64. Перекинул бинарник в Astra Linux, запускаю, а он мне:

Код
st: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.8' not found (required by ./Test)
./Test: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.15' not found (required by ./Test)
./Test: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.14' not found (required by ./Test)
Вот с этим уже вообще непонятно что делать. Astra невероятно убогая шняга, основан на Debian, в нем даже все репозитории удалены. Где можно эти библиотеки скачать и как обновить?
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 16:33     GNU/Linux Qt5.* - Линкуем статически #37
KOSHAK_, это уже совсем другая проблема. При сборке в статику нужно использовать более старые системные библиотеки чем на запускаемой машине.
То есть если вы собрали Qt на Ubuntu 14.04, то он не будет работать на 12.04, а на оборот будет. То есть вы должны собрать/слинковать Qt с либами старее чем у вас в ошибках.

Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Так там всего 3 команды...
За этими командами кроется очень много магии.
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 16:38     GNU/Linux Qt5.* - Линкуем статически #38
А можно подробнее про старые библиотеки? Как мне с ними собрать? В принципе вся задача в том, чтобы приложение запустилось на этой убогой системе, но писать что-то в ней не вариант, опять же из-за ее убогости и древности...
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,764
14.01.2015, 16:41     GNU/Linux Qt5.* - Линкуем статически #39
Цитата Сообщение от KOSHAK_ Посмотреть сообщение
Как мне с ними собрать?
Собрать кьют в древней системе. К примеру в Ubuntu 10.04 GLIBC_2.11. Вот на ней можете и собрать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.01.2015, 16:44     GNU/Linux Qt5.* - Линкуем статически
Еще ссылки по теме:
C++ Qt Qt5 + firebird
Qt5 + Raspberry Pi C++ Qt
Qt5 Vk API C++ Qt
Qt5 копирование C++ Qt
QT5/0/1 библиотеки C++ Qt

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
KOSHAK_
1 / 1 / 0
Регистрация: 16.11.2011
Сообщений: 108
14.01.2015, 16:44     GNU/Linux Qt5.* - Линкуем статически #40
Ага, т.е. поставить на виртуалку древнюю систему и собирать в ней? А версию Qt можно оставить прежней?
Yandex
Объявления
14.01.2015, 16:44     GNU/Linux Qt5.* - Линкуем статически
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru