Как статически связать библиотеки Qt? - PullRequest
0 голосов
/ 03 мая 2018

Я хочу статически связать библиотеки Qt с моей программой, чтобы она могла работать на моем школьном компьютере. У нас нет решимости установить что-либо на этот компьютер, поэтому статическое соединение - мой единственный шанс.

Пока это мой файл cmake

cmake_minimum_required(VERSION 3.9)

project(Calculator)

set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}  -Wall -Wpedantic -Wextra -std=gnu++14 -no-pie -fPIC  -static -lQt5Widgets -lQt5Gui -lQt5Core")

find_package(Qt5Widgets REQUIRED)
include_directories(/usr/include/qt/QtWidgets /usr/include/qt /usr/include/qt/QtGui /usr/include/qt   /usr/include/qt/QtCore /usr/include/qt)

set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

add_executable(${PROJECT_NAME} main.cpp calculator.cpp  resources.qrc calculatestring.cpp )

вот что я получаю, когда пытаюсь запустить этот файл cmake: -

/bin/ld: cannot find -lQt5Widgets
/bin/ld: cannot find -lQt5Gui
/bin/ld: cannot find -lQt5Core

если я уберу флаг -static, он прекрасно скомпилируется, но запускается только на машине, на которой установлен qt.

когда я пытаюсь запустить его на моем VirtualMachine с Arch Linux, на котором не установлен qt, выдается ошибка: -

error while loading shared libraries : libQt5Widgets.so.5: cannot open shared file: No such file or directory

Я хочу (не имею другого выбора) запустить мою программу без установки Qt на этих машинах.

Edit: -

Вопрос, который сравнивают как Возможный Дубликат, показывает, как связаться с Qmake. Я использую cmake. Также мой вопрос не ограничивается Qt.

1 Ответ

0 голосов
/ 03 мая 2018

Я предполагаю, что из вашего ответа вы разрабатываете для Linux.

Проблема, с которой вы сталкиваетесь, не зависит от системы здания ( cmake , qmake или другое).

Чтобы связать вашу программу с статической версией библиотеки, вам нужна эта библиотека на компьютере разработчика. В вашем случае у вас есть динамическая версия библиотеки (файл .so ), но у вас нет статическая версия (* 1017) * .a ). Следовательно, при попытке статической ссылки компоновщик ( ld ) говорит, что не может найти файл.

Для лицензирования выпусков двоичные файлы Qt с открытым исходным кодом распространяются только в виде динамических библиотек. Если вам нужно связать Qt статически, вы должны собрать его самостоятельно . Я предлагаю вам прочитать официальную документацию здесь , если вы заинтересованы в этом.

Однако, вам может не нужно статически связываться, если ваша проблема заключается в том, чтобы просто получить исполняемый файл на целевой машине без установки дополнительных пакетов.

Вы можете развернуть свое приложение, копируя исполняемый файл и файлы .so, необходимые на целевой машине, так же, как если бы вы работали в Windows, скопируйте файл .exe вместе со всеми необходимыми файлами .dll, если вы работали в Windows.

Вы можете использовать команду ldd , чтобы получить список динамических библиотек, в которых нуждается ваш исполняемый файл.

Однако Linux работает по-другому, и нельзя просто скопировать файлы .so. Вы должны указать загрузчику путь к файлам .so. Это можно сделать, установив переменную окружения LD_LIBRARY_PATH . В Интернете вы найдете множество примеров того, как правильно установить эту переменную.

В качестве альтернативы вы можете также создать пакет snap , если это разрешено на вашей целевой машине.

Удачи в школьном проекте!

...