Форум программистов, компьютерный форум 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. Просмотров 29413. Ответов 59
Метки нет (Все метки)

В связи с отсутствием в данной теме мануала по статической линковке приложений 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 и все вытекающие перекрестные ссылки по плагинам.
___________________________________________________________________________________________________________
Вроди бы ничего не забыл...
Надеюсь, статейка кому-нибудь поможет разобраться.
Спасибо и удачи
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 19:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос GNU/Linux Qt5.* - Линкуем статически (C++ Qt):

Timestamp->QdateTime (Qt5+Firebird+Linux) - C++ Qt
Направьте на путь истинный. В исходниках Qt5 есть небольшой пример, sqlbrowser. И есть база FB. Всё коннектится и показывается. Но есть...

Qt5 перенос приложения из windows7 в linux (Raspbery) - Кроссплатформенная разработка
Добрый вечер! Извиняюсь, не так давно знаком с Qt и линукс, нужна помощь. Задача стоит разработать приложение для микрокомпьютера...

Как статически ликовать QT 5.3.0 - C++ Qt
Как статистически ликовать QT 5.3.0 Собирать утилиты без требований библиотек QT да видел варианты QT 4.7 и другие - но по их...

Как собирать программу статически? - C++ Qt
Как собирать программу статически? Скиньте ссылку на нормальный мануал.

qmake. Заставить GCC линковать статически - C++ Qt
Нужно слинковать библиотеку GMP статически. Такая вещь в .pro файле, естественно, предпочитает динамические либы: unix:LIBS +=...

Задать количество строк и столбцов статически. QGridLayout - C++ Qt
Здравствуйте. опять прошу, подскажите метод или алгоритм: обычно менеджер компоновки QGridLayout занимает весь родительский виджет, и...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.01.2014, 20:28 #2
По поводу башскрипта который копирует либы. Это вы в нем прогу на С компилите и ей парсите ввод ldd?
Не проще было бы сразу на баше это сделать вместо того что бы такие странные вещи делать?
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.01.2014, 20:32  [ТС] #3
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Не проще было бы сразу на баше это сделать вместо того что бы такие странные вещи делать?
Проще, наверное Только вот
Цитата Сообщение от gromo Посмотреть сообщение
c башем знаком 2 дня
Та программа выделяет все , что до знаков " => " в выводе ldd и с префиксом 'lib'
Если вы знаете как, то можете сделать это на баше, Если пожелаете, конечно, - это намного упростит реализацию. И включим ваше решение сюда.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.01.2014, 20:34 #4
+ на x86_x64 либы лежат в /usr/lib64
+ на том же gentoo qt либы лежат в /usr/lib64/qt4, так что лучше использовать абсолютные пути при копировании
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.01.2014, 20:42  [ТС] #5
Цитата Сообщение от RazrFalcon Посмотреть сообщение
+ на x86_x64 либы лежат в /usr/lib64
Это симлинк. (во всяком случае у меня)
Цитата Сообщение от RazrFalcon Посмотреть сообщение
+ на том же gentoo qt либы лежат в /usr/lib64/qt4, так что лучше использовать абсолютные пути при копировании
Ну это к Qt5.* мануал, а не к 4, да и пути можно свои дописать. И где вы там неабсолютные пути увидели?
P.s. В арче например текущая версия Qt вообще без цифры, на неё просто сслыаться нужно как на 'qt', а остальные /usr/lib/qt4{,3,5} уже по надобности.
Миниатюры
GNU/Linux Qt5.* - Линкуем статически  
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.01.2014, 21:16 #6
Мое решение, возможно не самое лучшее, но всяко лучше того что выше:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
LIB_DIR=lib/
 
if [ "$#" -lt 1 ]; then
    echo "Usage: ./$(basename ${0}) < executable >"
    exit 1;
fi 
 
mkdir -p ${LIB_DIR}
#забираем все пути
SONAME_LIST=`ldd "$1" | sed 's/^.*> //g;s/ (.*//g;s/\t//g'`
for name in $SONAME_LIST; do
    # игнорируем некоторые либы
    if [ $name != "linux-vdso.so.1" ]; then
        linkname=`readlink $name`
        # не пытаемся копировать либы у которых нет симлинков
        if [ -n "$linkname" ]; then
            cp `dirname $name`"/"$linkname -t $LIB_DIR;
        fi
        cp -P ${name} -t $LIB_DIR;
    fi
done
Цитата Сообщение от gromo Посмотреть сообщение
Это симлинк. (во всяком случае у меня)
У всех симлинк, но у меня не обработало его, по каким-то причинам.
В генту симлинк на оборот
Bash
1
lib -> lib64
Да и при чем тут версия Qt, если вы просто собирает либы из ldd...

Добавлено через 7 минут
Даже проще:
Bash
1
SONAME_LIST=`ldd "$1" | sed 's/^.*> //g;s/ (.*//g;s/\t//g'`
на
Bash
1
SONAME_LIST=`ldd "$1" | grep -oe '/.* '`
Добавлено через 1 минуту
К слову у вас в инструкции пропущена самая важная часть - установка зависимостей для компиляции.
gng
639 / 485 / 133
Регистрация: 08.09.2013
Сообщений: 1,309
23.01.2014, 21:50 #7
Автор любезно согласился принимать критические замечания.
1.
Цитата Сообщение от gromo Посмотреть сообщение
Теперь все Qt и 3-rd party библиотеки сидят в бинарнике, НО дело еще не закончено.
Если посмотреть на вывод ldd, то можно увидеть, что приложение зависит еще от целой кучи не Qt-ных библиотек.
Это меня озадачило. Всякий раз, компилируя статически, я получаю что-то такое
Bash
1
2
gg@c-1:~/cc/tmp$ ldd a.out
    not a dynamic executable
Статические библиотеки, указанные в приведенном списке распространяются вместе с динамическими, часто в рамках одного пакета с заголовочными файлами. Особенно удивляет отсутствие статических libc и libstdc++ шестой версии, присутствующие практически везде, где есть gcc.
Да и какой смысл в статической линковке, если с бинарником все равно нужно распространять зоопарк библиотек.
Если какие-то библиетеки окажутся других версий, или вовсе отсутствуют в дистрибутиве, то да, имеет смысл скачать их исходники. Это займет не больше времени, чем разработка вышеприведенного оригинального кросс-скрипта.

2. Непонятна целевая аудитория такого распрстранения программы. Если программа открытая, то статическая компановка обычно не требуется. Достаточно указать зависимости в пакете. Если проприетарная, то такой подход нарушает LGPL, под которой распростаняется Qt, кроме оговоренного (на мой взгляд достаточно экзотического) случая, когда автор предоставит средства для работы своей программы с любой новой версией Qt.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
23.01.2014, 22:14 #8
gng,
1) Почему вы указываете ldd не исполняемый файл?
Все либы собрать статически почти не возможно. Обычно тягают только Qt + мелочевка. От системных либ никуда не уйти.
2) LGPL не запрещает статическу сборку.
gng
639 / 485 / 133
Регистрация: 08.09.2013
Сообщений: 1,309
23.01.2014, 22:57 #9
Цитата Сообщение от RazrFalcon Посмотреть сообщение
1) Почему вы указываете ldd не исполняемый файл?
a.out - имя исполняемого файла по умолчанию.
Цитата Сообщение от RazrFalcon Посмотреть сообщение
2) LGPL не запрещает статическу сборку.
Я написал, при каких условиях. Либо
1. Это свободно распространяемая программа, либо
2. Автор вместе с программой предоставляет инструменты, позволяющие запустить её с новыми версиями библиотеки Qt (которые ещё выйдут)

Добавлено через 3 минуты
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Все либы собрать статически почти не возможно.
Целью статической сборки обычно именно это и является. В мире СПО это практически всегда возможно, причем обычно без дополнительных усилий.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.01.2014, 23:05  [ТС] #10
Цитата Сообщение от RazrFalcon Посмотреть сообщение
Даже проще:
Вот так вот - век живи, век учись Нужно будет как-то отредактировать пост и включить туда ваш вариант.
Кстати, еще нужно сделать, там где "игнорируем некоторые либы" пропуск всех соответствующих ld.*
я никак не пойму как прописать это условие что-то.
Цитата Сообщение от gng Посмотреть сообщение
Это меня озадачило. Всякий раз, компилируя статически, я получаю что-то такое
Это вы компилируете Qt проект или что-то простое с 2-3 либами? Если второе, то у меня тоже так.
Цитата Сообщение от gng Посмотреть сообщение
Статические библиотеки, указанные в приведенном списке распространяются вместе с динамическими, часто в рамках одного пакета с заголовочными файлами.
По идее так и должно быть но у меня их нет. Например, взял случайную либу в /usr/lib/libxcb.so
Она принадлежит пакету libxcb, хотя должна принадлежать libxcb-devel, которого, к слову, даже нет. (ну я только в официальных репах смотрел).
Что касается libc.a и libstdc++.a, они, безусловно, присутствуют, но их, насколько я знаю, небезопасно линковать статически. Если libc.a еще можно, потому что ее ABI, грубо говоря, прост как валенок, то libstdc++.a требует какой-то runtime identification/support ... что-то такое для поддержки исключений RTTI, что, в свою очередь требует динамич. линковки.
Более того, есть опция -static-libstdc++, в таком случае g++ принимает решение: можно/нужно ли линковать статически. В моем случае не связывал ни в какую. Может я не туда прописывал эту опцию в .pro файле, черт иногда поймет этот qmake...
Цитата Сообщение от gng Посмотреть сообщение
Да и какой смысл в статической линковке, если с бинарником все равно нужно распространять зоопарк библиотек.
Ну а если древняя очень система, на которой будет производиться запуск приложения?
Цитата Сообщение от gng Посмотреть сообщение
Если проприетарная, то такой подход нарушает LGPL, под которой распростаняется Qt
Не совсем понимаю, проприетарная или LGPL ? Насколько я знаю, это разные вещи, ведь Qt распространяется в 3 видах лицензии: GPL, LGPL, Commercial.
Вообще, это один из подходов, который описан в документации.
Вот http://qt-project.org/doc/qt-4.8/dep...cation-package
Второй в списке.
_______________________________________________
P.s. Спасибо за внимание и критику
Dmitriy_M
1342 / 1223 / 112
Регистрация: 20.03.2009
Сообщений: 4,408
Записей в блоге: 11
23.01.2014, 23:11 #11
libnvidia-tls.so.331.38 => lib/libnvidia-tls.so.331.38 (0x00007fe19a05b000)
libnvidia-glcore.so.331.38 => lib/libnvidia-glcore.so.331.38 (0x00007fe19784d000)

Цитата Сообщение от gromo Посмотреть сообщение
Теперь все это дело в .tar.gz и можете делиться с друзьями своим приложением
ABI между GLibc на твоей машине и Linux kernel твоих друзей совместимо?

Добавлено через 2 минуты
Цитата Сообщение от gromo Посмотреть сообщение
Она принадлежит пакету libxcb, хотя должна принадлежать libxcb-devel
Вранье. Нет там такого.

Добавлено через 49 секунд
Цитата Сообщение от gromo Посмотреть сообщение
Ну а если древняя очень система, на которой будет производиться запуск приложения?
с вероятностью 99% не запуститься из-за бинарной не совместимостью с ядром.
gromo
370 / 269 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
23.01.2014, 23:18  [ТС] #12
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
ABI между GLibc на твоей машине и Linux kernel твоих друзей совместимо?
Не совсем понимаю, что вы имеете ввиду... ABI в Gglibc практически не меняется, разве что в мажорных версиях? Или я не прав?

Добавлено через 1 минуту
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
Вранье. Нет там такого
чего нет? libxcb-devel нет такого пакет, я это написал.

Добавлено через 1 минуту
Написал я это потому, что выше был разговор о том, что с динамическими либами почти всегда идут статические. Статические обычно являются частью devel-пакета. я и написал, что такого пакета нет, как и статических библиотек с ним идущих

Добавлено через 1 минуту
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
с вероятностью 99% не запуститься из-за бинарной не совместимостью с ядром.
Ну, я думаю, о kernel < 2.6.32* речь уже не идет...
Dmitriy_M
1342 / 1223 / 112
Регистрация: 20.03.2009
Сообщений: 4,408
Записей в блоге: 11
23.01.2014, 23:48 #13
Цитата Сообщение от gromo Посмотреть сообщение
ABI в Gglibc практически не меняется, разве что в мажорных версиях? Или я не прав?
API != ABI. GLibc может вызывать функции ядра, которых нет в предыдущих ядрах.
Цитата Сообщение от gromo Посмотреть сообщение
чего нет? libxcb-devel нет такого пакет, я это написал.
Пакет *-devel это заголовочные файлы и поэтому libxcb не зависит от libxcb-devel, а вот libxcb-devel зависит от libxcb, т.к. это пакет для разработки, а для разработки нужны заголовочные файлы+либа.
Цитата Сообщение от gromo Посмотреть сообщение
Ну, я думаю, о kernel < 2.6.32* речь уже не идет...
RHEL 5 еще актуален. Да и для версии 2.6.32 гарантий нет.
RazrFalcon
1379 / 1236 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
24.01.2014, 00:00 #14
Собственно обычная проблема зоопарка линукс дистров. Проще сорцы выложить, а те кому - надо соберут.
Ну или deb/rpm который поставит нужные зависимости.
gng
639 / 485 / 133
Регистрация: 08.09.2013
Сообщений: 1,309
24.01.2014, 00:34 #15
Цитата Сообщение от Dmitriy_M Посмотреть сообщение
RHEL 5 еще актуален
Ради полноты надо вспомнить о LSB, блаодаря которой уже не один год любители совместимых бинарников (в основном проприетарщики и авторы вирусов) компилируют их в RHEL4.
Цитата Сообщение от gromo Посмотреть сообщение
Что касается libc.a и libstdc++.a, они, безусловно, присутствуют, но их, насколько я знаю, небезопасно линковать статически
Здесь проблема, как заметил уважаемый Dmitriy_M, больше в ABI, но не в статической компановке.

Добавлено через 5 минут
Цитата Сообщение от gromo Посмотреть сообщение
Не совсем понимаю, проприетарная или LGPL ? Насколько я знаю, это разные вещи, ведь Qt распространяется в 3 видах лицензии: GPL, LGPL, Commercial.
1. GPL - ваша программа тоже должна быть GPL незавимо от способа линковки.
2. LGPL - ваша программа может быть проприетарной при динамической линковке либо при соблюдении вышеописанного условия.
3.Commercial - покупаете и линкуете как хотите.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 00:34
Привет! Вот еще темы с ответами:

Учебник по qt5 - C++ Qt
Я знаю, что этот вопрос много раз задавался, но везде под 4 версию, а там, где просят учебники под 5, нет ответа пожалуйста, посоветуйте...

Qt5 + Raspberry Pi - C++ Qt
Кто-нибудь может подсказать и описать, каким образом я могу собрать сам Qt5 под Raspberry Pi (кросс-компиляцией какой-нибудь, чтобы этот...

QT5/0/1 библиотеки - C++ Qt
есть код, есть хекс и длл файл и исходники, нет библиотек. кто сможет помочь? уже 5 сутки долбаюсь. вот само задание &quot;Задача о...

Qt5 Vk API - C++ Qt
Всем привет. Решил поиграться с vk api. Возник не большой трабл. Имеем три файла #include &lt;QObject&gt; #include &lt;QWidget&gt; #include...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.01.2014, 00:34
Ответ Создать тему
Опции темы

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