我想将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的机器上运行。
当我尝试在没有安装qt的Arch Linux上运行我的VirtualMachine时,它会给我错误: -
error while loading shared libraries : libQt5Widgets.so.5: cannot open shared file: No such file or directory
我希望(别无选择)在不在这些机器上安装Qt的情况下运行我的程序。
编辑: -
类似可能重复的问题显示了如何与Qmake链接。我正在使用cmake。而且我的问题不仅限于Qt。
答案 0 :(得分:3)
我从你的回答中假设你正在开发Linux。
您面临的问题不依赖于构建系统( cmake , qmake ,否则)。
要将程序链接到库的静态版本,您需要在开发计算机上使用该库。在您的情况下,您拥有库的动态版本( .so 文件),但您没有静态版本( .a )。因此,当您尝试静态链接时,链接器( ld )表示无法找到该文件。
对于许可问题,Qt开源二进制文件仅作为动态库分发。如果您需要静态链接Qt,则必须自己构建。 如果您有兴趣尝试此操作,我邀请您阅读官方文档here。
但是,可能不需要静态链接,如果您的问题只是在目标计算机上获取可执行文件而不安装额外的软件包。
您可以部署应用程序复制目标计算机所需的可执行文件和.so文件,就像您在Windows上运行时将.exe文件与所需的所有.dll文件一起复制一样。
您可以使用命令 ldd 来获取可执行文件所需的动态库列表。
然而,Linux以不同的方式工作,并且不能简单地复制.so文件。您必须为加载程序提供查找.so文件的路径。这可以通过设置 LD_LIBRARY_PATH 环境变量来完成。你会在互联网上找到很多关于如何正确设置这个变量的例子。
或者,如果您的目标计算机上允许这样做,您也可以考虑构建快照包。
祝你学校的项目好运!