我有一个程序,可以通过兆字节的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静态链接库。
1条答案
按热度按时间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-static
或x64-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)
,但这两种方式都不会有什么坏处。