使用 CMake 分发 Qt5 控制台应用程序

Posted

技术标签:

【中文标题】使用 CMake 分发 Qt5 控制台应用程序【英文标题】:Distribute a Qt5 console application using CMake 【发布时间】:2019-04-18 08:51:01 【问题描述】:

我尝试使用 CMake 分发一个基本的 Qt 控制台应用程序,但徒劳无功。

让我们考虑这两个文件:

ma​​in.cpp

#include <QDebug>

int main(int argc, char *argv[])

    qDebug() << "Hello Wolrd!";
    return 0;

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.12)

project(HelloWorld)

set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Qt5Widgets REQUIRED)

add_executable($PROJECT_NAME main.cpp)

qt5_use_modules($PROJECT_NAME Widgets)

接下来我编译main.cpp文件:

$ cmake .

-- The C compiler identification is AppleClang 10.0.1.10010046
-- The CXX compiler identification is AppleClang 10.0.1.10010046
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /path/to/HelloWorld

$ make

Scanning dependencies of target HelloWorld_autogen
[ 25%] Automatic MOC for target HelloWorld
[ 25%] Built target HelloWorld_autogen
Scanning dependencies of target HelloWorld
[ 50%] Building CXX object CMakeFiles/HelloWorld.dir/HelloWorld_autogen/mocs_compilation.cpp.o
[ 75%] Building CXX object CMakeFiles/HelloWorld.dir/main.cpp.o
[100%] Linking CXX executable HelloWorld
[100%] Built target HelloWorld

我得到一个HelloWorld 二进制文件。

当我尝试在另一台没有安装 Qt 的计算机上执行后一个文件时,问题就出现了。我收到以下错误:

dyld: Library not loaded: @rpath/QtWidgets.framework/Versions/5/QtWidgets
  Referenced from: /path/to/HelloWorld/./HelloWorld
  Reason: image not found
./test.sh: line 4: 68737 Abort trap: 6           ./HelloWorld

让它作为一个独立的应用程序工作缺少什么?

环境:

MacOs Mojave (10.14.4) Qt 5.10.1

【问题讨论】:

doc.qt.io/qt-5.9/osx-deployment.html 【参考方案1】:

最简单的方法是静态链接 Qt。查看有关deploying for macOS 的文档。

请注意,Qt 是根据 LGPL 获得许可的,这可能对静态链接有影响。详情请查看this FAQ。

您也可以使用包和框架,但我不确定它与控制台应用程序的效果如何。

【讨论】:

以上是关于使用 CMake 分发 Qt5 控制台应用程序的主要内容,如果未能解决你的问题,请参考以下文章

使用 cmake 的跨平台 Qt5 项目

CMake 链接 Qt5::Svg 但 QImageReader 看不到

Qt5 CMake 将所有库包含到可执行文件中

使用 cmake 构建 Qt5 项目

初步编译QT5.15.2+VS2019+VTK8.2.0

初步编译QT5.15.2+VS2019+VTK8.1.0