2016-11-28 10 views
0

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

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

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

ответ

0

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

The target is a static library (lib only). The proper compiler flags will automatically be added to the project.

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

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

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

+0

Когда я использую CONFIG + = static, он компилируется нормально, без ошибок. Но когда я использую QMAKE_LFLAGS + = -static он показывает мне эти ошибки: ошибка: не удается найти -lgnustl_shared ошибки: не удается найти -llog ошибки: не удается найти -lz ошибки: не удается найти -ldl –

+0

Если вы хотите связать статический в библиотеку вы должны иметь статическую версию этой библиотеки. '-lgnustl_shared' звучит так же, как это общая библиотека, обычно без суффикса' _shared', компоновщик будет искать библиотеку '.a' библиотеки, но в вашем случае такой вещи нет. Фактическая библиотека - '-lgnustl_static'. Вы не получаете ошибок без этого флага, потому что без него вы вообще не связываете статически. – dtech

+0

Повторяю, когда я использую CONFIG + = static, он компилируется нормально без ошибок. –

-1

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

  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!).

+0

1 - почему? То, что он хочет сделать, - создать общую библиотеку, которая статически связывает свои зависимости. – dtech

+0

Как насчет использования QMAKE_LFLAG_RELEASE? –

+0

@ddriver Поскольку, если у вас нет статической сборки Qt, то зависимость Qt не может быть выполнена статически: объектные архивы для статической привязки не существуют. –