Как иметь статическую связь в общей библиотеке в Qt Creator?

Вопрос говорит обо всем. Я использую Qt Creator, который использует QMake, и я хочу построить .so файл разделяемой библиотеки, в котором все его зависимости статически связаны. подобно libstdc++, и так далее.

Но когда я использую CONFIG += static это также изменяет библиотеку на статическую библиотеку и производит .a статический файл, который мне не нужен. Так что мой вопрос не является дубликатом этого.

Я искал здесь, но я не смог найти подходящую вещь.

2 ответа

Решение

CONFIG += static это неправильный флаг, как указано в документации:

Цель - статическая библиотека (только lib). Правильные флаги компилятора будут автоматически добавлены в проект.

Если вы хотите связать зависимости статически и создать общую библиотеку, вам нужно передать флаг компоновщику, поэтому добавьте QMAKE_LFLAGS += -static на ваш .pro файл.

Простые тесты дают DLL-файл 16 КБ без этого флага и DLL-файл 995 КБ с ним. Кроме того, если обходчику зависимостей нужно доверять, больший dll не имеет внешних зависимостей, а меньший зависит от libgcc а также libstdc++ (это просто тривиально std::cout тестовое задание).

Очевидно, что вам не нужна статическая сборка qt или qmake. Протестировано с "стандартной" 32-битной версией Qt.

Вам нужно три вещи:

  1. Вам нужен сам Qt, собранный как статическая библиотека:
  2. Вам нужно сказать, что Qt статически связан с средой выполнения.
  3. Вам необходимо статически связать вашу библиотеку со средой выполнения. Это обрабатывается автоматически.

Для всего этого вам нужно настроить собственную сборку Qt с -static -static-runtime аргументы. Любой исполняемый файл / библиотека, которую вы собираете с помощью этой сборки Qt, будет статически связан с средой выполнения и статически связан с Qt (если он использует Qt).

Стоит отметить, что ни один из вышеперечисленных не требует каких-либо изменений в вашем проекте .pro файл. И наоборот, вы ничего не можете сделать с файлом проекта, чтобы получить тот же эффект, вообще говоря. Вы должны получить правильно сконфигурированный Qt, и все будет обработано оттуда.

Сама ваша библиотека не требует использования Qt, за исключением наличия файла проекта, который управляет сборкой. Например, это будет элементарная библиотека, которая не использует ни Qt, ни C++:

TARGET = mylib
TEMPLATE = lib
CONFIG -= qt
SOURCES = mylib.c
HEADERS = mylib.h

Пока вы вызываете qmake из Qt, настроенного как указано выше, разделяемая библиотека не будет динамически связываться со средой исполнения языка (ни с Qt, но в этом случае она вообще не будет ссылаться на Qt!).

Другие вопросы по тегам