cmake 静态链接到Qt

omvjsjqw  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个程序,可以通过兆字节的csv数据进行排序,并处理它们,用于图形和可视化的目的。我添加了一个c++ winforms(CLR)gui,以便使用它的人发现它很方便。可执行文件是一个单一的文件,用户发现非常方便复制/粘贴周围,它是非常便携的性质(没有安装程序)。我想继续使用Qt作为GUI,因为:
1.我想添加一个快照功能,它显示一个演示图,以更方便
1.我们将开始使用运行Linux的Raspberry pi来完成此任务
1.我将移植另一个应用程序,很像arduino绘图仪,它可以在收集csv数据时真实的绘制(现在我使用imgui)。
问题是Qt非常令人沮丧。在花了3天的时间从官方安装向导的许多失败下载后,我想如果没有大量的dll,二进制文件是无用的。我知道vcpkg(在Windows上),使用它,我有一个静态编译版本的Qt base。我正在为我的项目使用CMake构建系统,并试图看看它是否有效。我甚至不能让一个空的控制台应用程序静态链接到Qt。CMake文件如下所示:

cmake_minimum_required(VERSION 3.16)

project(helloworld VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# this is for find_package() to be able to find vcpkg packages
include(C:/Users/Rajat/vcpkg/scripts/buildsystems/vcpkg.cmake)

# this I found somewhere supposed to force CMake to link to lib files, not sure if it works that way
list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)

# finding the Qt6 packages
find_package(Qt6 REQUIRED COMPONENTS Core)

qt_standard_project_setup()

qt_add_executable(helloworld
    main.cpp
)

# linker script instructions - should I change something? PUBLIC doesn't work, that's what I usually use.
target_link_libraries(helloworld PRIVATE Qt6::Core)

它确实构建了,但它仍然链接到dll,没有它们,我就无法运行可执行文件。我必须做什么才能让它静态链接?
请注意,GUI并不是我真正喜欢的,我在桌面CLI和嵌入式系统方面有最多的经验,所有这些都是静态链接到所有东西的,否则它们不会工作。所以我不熟悉如何在dll可用时强制CMake静态链接库。

q7solyqu

q7solyqu1#

a)include(C:/Users/Rajat/vcpkg/scripts/buildsystems/vcpkg.cmake)需要在project()之前(需要清除缓存)
B)list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)不是必需的,应删除。vcpkg只构建一种
c)您需要将VCPKG_TARGET_TRIPLET设置为一个三元组,其中VCPKG_LIBRARY_LINKAGE设置为static(例如x64-windows-staticx64-windows-static-md)。这也需要在project()之前发生。
d)您可能还希望将VCPKG_HOST_TRIPLET设置为与VCPKG_TARGET_TRIPLET相同的值
e)如果你没有在vcpkg中运行manifest模式,你必须手动执行vcpkg install qtbase:<TARGET_TRIPLET> f)根据cmake qt API的文档,你不需要target_link_libraries(helloworld PRIVATE Qt6::Core),但这两种方式都不会有什么坏处。

相关问题