Что за библиотеки *.a в $(QTDIR)\lib\ ?



  • Здравствуйте все!

    Хочу выяснить этот волнующий вопрос.
    Долгое время вижу на форумах, как некоторые участники пишут, что у них не получается собрать программу статически. Им отвечают про необходимость статической сборки Qt sdk, на что они отвечают, что библиотеки же уже есть в готовой сборке!!! Вот же они!
    Но никто не писал об успешной статической сборке своей программы с помощью них.

    Дак кто-нибудь может пояснить назначение этих библиотек.



  • Я ставила библиотеку (брала отсюда), потом пересобирала для статического варианта (ключики у configure для этого есть). Так что у меня стоят на компе две версии одной и той же библиотеки. Когда мне нужна статическая сборка , запускаю батник, где указаны пути к статической библиотеке. Всё компилится, всё собирается. Весит такое приложение, конечно же, больше, зато никаких dll не требует при переносе на другие машины .



  • Прошу прощения. Не сразу заметила, что речь идёт о Линуксе. У меня винда. Обычно именно с ней у всех проблемы. А линуксоиды, по-моему, таких бед не испытывают.



  • Во-первых речь о windows, во-вторых вопрос не много другой, а не как собрать программу статически...



  • @Meh07
    Добрый день. Библиотеки которые вы видите в директории Qt не для статической линковки. Они служат для того чтобы подключать динамические библиотеки. В OpenSource версиях установщиков Qt не включают статические библиотеки из-за лицензионных ограничений. Для статической линковки вам придется собирать Qt самому (если конечно не купите коммерческую версию у Digia).



  • @Yolkina Anna
    Добрый день. Можете поподробнее рассказать о вашем батнике? Я со статической линковкой что-то не сдружился :) .



  • @qxoz
    Ага, спасибо за инфу. Приоткрыли завесу.



  • [quote author="meh07" date="1387448094"]Во-первых речь о windows, во-вторых вопрос не много другой, а не как собрать программу статически...[/quote]
    *Если вы читаете пост, где упоминаются библиотеки с расширением .a , значит, вы читаете пост линуксоида!!!

    потому и решила, что речь идёт о Линуксе.
    Для винды библиотеки называются, например QtCore4d .dll (отладочные версии) и QtCore4.dll (релизные) для динамической сборки (такие извольте таскать с приложением, если нужно, чтобы заработало на безкутешных машинах). И QtCore4d.lib и QtCore4.lib - для статической сборки.

    Как верно заметил qxoz, вам придётся самому собрать статическую библиотеку.



  • [quote author="qxoz" date="1387514820"]Yolkina Anna
    Добрый день. Можете поподробнее рассказать о вашем батнике? Я со статической линковкой что-то не сдружился :) .[/quote]

    Расскажу, что делала с самого начала:
    У меня стоит MSVS-2008 и Qt-4.
    Я сделала так:

    1. Установила библиотеку (одну и ту же версию) в каталоги ПутьДоQt\shared и ПутьДоQt\static. Простым копированием размножить не получилось. Видимо, при сборке где-то в глубине qmake прописывается путь установки, а потом используется.

    2. В каталоге ПутьДоQt\static пересобрала статическую библиотеку. Руководствовалась статьёй отсюда http://www.doc.crossplatform.ru/qt/4.8.x/html-qt/deployment-windows.html
      Здесь тоже была статья о том, как собрать статическую библиотеку под Винодой. Писал линуксоид, но, как ни странно, по его рекомендациям всё получается. Ссылки не дам - потеряла.

    3. Теперь о сборке приложений. Это для qxoz.
      В каталоге \bin обеих библиотек лежит файлик qtvars.bat с таким содержанием (это файл из динамической сборки. Путь к статической сборке выглядит " D:\Qt\4.8.4_static"):

    @@echo off
    rem
    rem This file is generated by the Qt installer
    rem

    echo Setting up a Qt environment...

    set QTDIR=D:\Qt\4.8.4_shared
    echo -- QTDIR set to " %QTDIR% "
    set PATH=%QTDIR%\bin;%PATH%
    echo -- Added D:\Qt\4.8.4_shared\bin to PATH
    set QMAKESPEC=win32-msvc2008
    echo -- QMAKESPEC set to "win32-msvc2008"

    if not "%1"=="vsvars" goto ENDVSVARS
    call "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
    :ENDVSVARS

    if not "%1"=="vsstart" goto ENDVSSTART
    call "D:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat" x86
    devenv /useenv
    :ENDVSSTART
    @

    тут устанавливаются переменные окружения для QT. Вот его-то я и запускаю из каталога нужной мне сборки.
    Если нужна консоль (иногда бывает нужна), запускаю так
    @
    cmd.exe /k ПутьДоНужнойQT\bin\qtvars vsvars
    @

    • устанавливаются переменные окружения для Qt и MSVS, запускается окно консоли. qmake запускается из соответствующего каталога и создаёт MakeFile, в котором прописаны нужные для данной сборки ключики. Можете создать MakeFile для одного и того же проекта но для разных конфигураций Qt, и сравнить. qmake, запущенная из статической библиотеки, создаст MakeFile, где будут упоминаться .lib библиотеки, а, запущенная из динамической библиотеки, создаст MakeFile с .dll

    Если буду работать под средой, когда запускаю так:
    @
    ПутьДоНужнойQT\bin\qtvars vsstatr
    @

    • стартует MSVS.

    Для среды есть плагин для Qt (кажется, тоже здесь есть инсталятор, а я брала из Хакера), который делает эту нуднуб работу сам.



  • Спасибо большое за подробное описание, мне очень пригодится.

    [quote author="Yolkina Anna" date="1387550928"][quote author="meh07" date="1387448094"]Во-первых речь о windows, во-вторых вопрос не много другой, а не как собрать программу статически...[/quote]
    *Если вы читаете пост, где упоминаются библиотеки с расширением .a , значит, вы читаете пост линуксоида!!!
    [/quote]
    Есть небольшое исключение если используется "MinGW":http://www.mingw.org/ или другой подобный инструмент. Вместо привычных *.lib использутся *.a ну а динамическая библиотека в обеих случаях(MinGW, MSVS) *.dll.



  • [quote author="qxoz" date="1387592438"]
    Есть небольшое исключение если используется "MinGW":http://www.mingw.org/ или другой подобный инструмент. Вместо привычных *.lib использутся *.a ну а динамическая библиотека в обеих случаях(MinGW, MSVS) *.dll.
    [/quote]

    Не знала про MinGW (в "наследство" достался комп с MSVS, так на неё и сижу). Спасибо.
    Я думаю, что всё равно проблема в том, что при сборке приложения народ не указывает пути до нужной библиотеки.
    Кстати, когда я пыталась с оптимизировать библиотеки и держать на диске только один экземпляр каталога /bin, а вместо /lib сделать ссылку и менять её, в зависимости оот того, какую библиотеку хочу использовать, получилась полная фигня - qmake, собранная с динамической библиотекой никак не хотела правильно генерить MakeFile для статики. Сейчас уже не помню, что именно происходило, но в результате всё равно пришлось делать две полные версии . Причём обе инсталлировать в разные каталоги, как я уже писала. Копирование не помогало, скопированная qmake упорно лезла в каталог, указанный при инсталляции.



  • Предвидя подобные проблемы и по большей части из-за ленивости я пошел по простому но расточительному пути. У меня для каждой системы(Win, Lin, Mac) и вида(Qt4, Qt5, static, dynamic) сборки есть отдельная виртуальная машина . Не умно но проще :) .
    Но все это уже не относится к теме.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.