Как иметь статическую связь в общей библиотеке в 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.
Вам нужно три вещи:
- Вам нужен сам Qt, собранный как статическая библиотека:
- Вам нужно сказать, что Qt статически связан с средой выполнения.
- Вам необходимо статически связать вашу библиотеку со средой выполнения. Это обрабатывается автоматически.
Для всего этого вам нужно настроить собственную сборку 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!).