如何静态 link Qt 库?
How to statically link Qt libraries?
我想将 link Qt 库静态添加到我的程序中,这样它就可以 运行 在我的学校 computer.We 不需要在那些计算机上静态安装任何东西 computer.We =32=]ing是我唯一的机会。
到目前为止,这是我的 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 的机器上只能编译 运行s。
当我尝试在我的没有安装 qt 的 Arch Linux VirtualMachine 上 运行 它时,它给我错误:-
error while loading shared libraries : libQt5Widgets.so.5: cannot open shared file: No such file or directory
我想(别无选择)运行 我的程序 运行 而无需在那些机器上安装 Qt。
编辑:-
被比作可能重复的问题展示了如何 link 使用 Qmake。我正在使用 cmake 。而且我的问题不限于 Qt。
根据您的回答,我假设您正在开发 Linux。
您遇到的问题与构建系统无关(cmake、qmake,否则)。
为了 link 你的程序到一个 static 版本的库,你需要在你的开发机器上使用那个库。在你的情况下,你有 dynamic 版本的库(.so 文件),但你没有 static一个(.a)。因此,当您尝试静态 link 时,linker (ld) 说它找不到文件。
对于许可问题,Qt 开源二进制文件仅作为动态 库分发。如果您需要 link Qt 静态,您必须 自己构建它 。
如果您有兴趣尝试此操作,我邀请您阅读官方文档 here。
但是,您可能不需要静态link,如果您的问题只是在目标机器上获取可执行文件而不安装额外的包。
您可以部署您的应用程序,将可执行文件和所需的 .so 文件复制到目标机器,如果您是 运行 在 Windows.
您可以使用命令ldd 来获取您的可执行文件所需的动态库列表。
但是,Linux 以不同的方式工作,不能简单地复制 .so 文件。您必须为加载程序提供查找 .so 文件的路径。这可以通过设置 LD_LIBRARY_PATH 环境变量来完成。您会在 Internet 上找到大量有关如何正确设置此变量的示例。
或者,如果您的目标机器允许,您也可以考虑构建一个 snap 包。
祝你的学校项目顺利!
我想将 link Qt 库静态添加到我的程序中,这样它就可以 运行 在我的学校 computer.We 不需要在那些计算机上静态安装任何东西 computer.We =32=]ing是我唯一的机会。
到目前为止,这是我的 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 的机器上只能编译 运行s。
当我尝试在我的没有安装 qt 的 Arch Linux VirtualMachine 上 运行 它时,它给我错误:-
error while loading shared libraries : libQt5Widgets.so.5: cannot open shared file: No such file or directory
我想(别无选择)运行 我的程序 运行 而无需在那些机器上安装 Qt。
编辑:-
被比作可能重复的问题展示了如何 link 使用 Qmake。我正在使用 cmake 。而且我的问题不限于 Qt。
根据您的回答,我假设您正在开发 Linux。
您遇到的问题与构建系统无关(cmake、qmake,否则)。
为了 link 你的程序到一个 static 版本的库,你需要在你的开发机器上使用那个库。在你的情况下,你有 dynamic 版本的库(.so 文件),但你没有 static一个(.a)。因此,当您尝试静态 link 时,linker (ld) 说它找不到文件。
对于许可问题,Qt 开源二进制文件仅作为动态 库分发。如果您需要 link Qt 静态,您必须 自己构建它 。 如果您有兴趣尝试此操作,我邀请您阅读官方文档 here。
但是,您可能不需要静态link,如果您的问题只是在目标机器上获取可执行文件而不安装额外的包。
您可以部署您的应用程序,将可执行文件和所需的 .so 文件复制到目标机器,如果您是 运行 在 Windows.
您可以使用命令ldd 来获取您的可执行文件所需的动态库列表。
但是,Linux 以不同的方式工作,不能简单地复制 .so 文件。您必须为加载程序提供查找 .so 文件的路径。这可以通过设置 LD_LIBRARY_PATH 环境变量来完成。您会在 Internet 上找到大量有关如何正确设置此变量的示例。
或者,如果您的目标机器允许,您也可以考虑构建一个 snap 包。
祝你的学校项目顺利!