ora*_*yan 1 c++ qt static-linking
我想将 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 )
Run Code Online (Sandbox Code Playgroud)
这是我尝试运行此 cmake 文件时得到的结果:-
/bin/ld: cannot find -lQt5Widgets
/bin/ld: cannot find -lQt5Gui
/bin/ld: cannot find -lQt5Core
Run Code Online (Sandbox Code Playgroud)
如果我删除-static标志,它编译得很好,但只能在安装了 qt 的机器上运行。
当我尝试在没有安装 qt 的 Arch Linux 的 VirtualMachine 上运行它时,它给了我错误:-
error while loading shared libraries : libQt5Widgets.so.5: cannot open shared file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我想(别无选择)在那些机器上不安装 Qt 的情况下运行我的程序。
编辑:-
被比作可能重复的问题显示了如何与 Qmake 链接。我正在使用 cmake 。此外,我的问题不仅限于 Qt。
我从你的回答中假设你是在 Linux 上开发的。
您面临的问题不取决于构建系统(cmake、qmake或其他)。
要将您的程序链接到库的静态版本,您需要在开发机器上使用该库。在您的情况下,您拥有库的动态版本(.so文件),但没有静态版本(.a)。因此,当您尝试静态链接时,链接器 ( ld ) 说它找不到该文件。
对于许可问题,Qt 开源二进制文件仅作为动态库分发。如果需要静态链接 Qt,则必须自己构建。如果您有兴趣尝试此操作,我邀请您阅读此处的官方文档。
但是,您可能不需要静态链接,如果您的问题只是在目标机器上获取可执行文件而不安装额外的包。
您可以部署应用程序,将可执行文件和所需的 .so 文件复制到目标计算机,这与复制 .exe 文件和所需的所有 .dll 文件的方式相同,如果您在 Windows 上运行。
您可以使用命令ldd来获取可执行文件所需的动态库列表。
但是,Linux 的工作方式不同,不能简单地复制 .so 文件。您必须为加载程序提供查找 .so 文件的路径。这可以通过设置LD_LIBRARY_PATH环境变量来完成。您会在 Internet 上找到大量有关如何正确设置此变量的示例。
或者,如果您的目标机器允许,您也可以考虑构建一个snap包。
祝你的学校项目好运!