C++/Qt 发行版中的库链接

Posted

技术标签:

【中文标题】C++/Qt 发行版中的库链接【英文标题】:Library linking in C++/Qt distribution 【发布时间】:2015-11-18 16:23:11 【问题描述】:

我正在用 C++11 开发一个项目,在分发、编译、打包等方面并不是最大的专家。我使用

CMake 3.1.0 Qt 5.4(社区版)

此外,我希望该程序可以在 OS X 和 Windows 上运行。因此,我的 IDE 包括:

苹果 Xcode 7 Microsoft Visual Studio 2013

我在构建 Windows 时遇到问题。截至目前,我无法将可执行文件复制到另一台计算机,因为不包括 DLL 文件。如果我复制了我收到错误的所有 DLL 文件,它只是说程序无法运行。我读过一些关于静态库链接的文章,但不确定这是否是我需要的。

我的 CMakeLists.txt 看起来像这样:

set(libsources file1.cpp file2.cpp)
set(exec1sources file3.cpp file4.cpp)
set(exec2sources file5.cpp file6.cpp)

# some qt commands

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ..)
add_library(sharedlib $libsources])
generate_export_header(sharedlib)
add_executable(exec1 $exec1sources)
add_executable(exec2 $exec2sources)

target_link_libraries(sharedlib Qt5::A Qt5::B)
target_link_libraries(exec1 Qt5::A Qt5::B sharedlib)
target_link_libraries(exec2 Qt5::A Qt5::C sharedlib)

install(TARGETS exec1 RUNTIME DESTINATION bin)
install(TARGETS exec2 RUNTIME DESTINATION bin)

您可能会看到,我想要 2 个可执行文件,每个都使用共享库中的某些功能。我希望他们独立工作。

我可能不是世界上第一个遇到此问题的人,但我无法在 *** 上找到类似的帖子。

【问题讨论】:

I am not able to copy the executables to another computer, since the DLL-files are not included. - 你指的是哪个 DLL 文件? QT的?此外,您将可执行文件从一台 Windows 机器复制到另一台 具有相同架构的 Windows 机器,不是吗? @Tsyvarev 我的意思是 Qt DLL 文件。主要是。还有一些其他需要(我认为似乎与Visual Studio有关)。我从 Windows 7 x32 机器复制到 Windows 10 x64。有问题吗? 是的,使用在 x32 平台上编译到 x64 的可执行文件可能会出现问题。为了使这个可执行文件工作,您至少必须在 x64 机器上安装 32 位 Qt。如果您只想将 QT 文件复制到目标机器,您可能需要将它们复制到带有可执行文件本身的目录中。 Windows 没有关于 RPATH 的概念,因此将 DLL 放在与主机相同的位置不会使它们可搜索(直到默认情况下在目标机器上搜索此位置)。 考虑按照 Felix 的建议使用 windeployqt/macdeployqt 或 CPack。 【参考方案1】:

你试过windeployqt吗?它将自动为您的应用程序复制所有依赖项。您可以在 Qt-Kit 的 bin 文件夹中找到它

对于 Mac,有一个类似的工具,称为 macdeployqt。

【讨论】:

以上是关于C++/Qt 发行版中的库链接的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2017 发行版中的 Eigen cwisemin/cwisemax 访问冲突

Mono 发行版中的 C# 编译器版本是不是与 Mono 版本相同?

Perl CPAN 发行版中 $AUTHORITY 变量的用途是啥?

托管 Java Web Start 应用程序以包含在 Linux 发行版中

如何在 Mac 上将 openCV 安装到 Enthought python 发行版中

有没有办法让操作系统在 CPAN 发行版中定义依赖关系?