【问题标题】:Qt app built with CMake compiles, but doesn't run, in Windows使用 CMake 构建的 Qt 应用程序在 Windows 中编译但不运行
【发布时间】:2019-07-16 18:29:20
【问题描述】:

我正在将一个程序移植到 Windows 并对其进行编译,但是当我运行它时,它显示“Qt5Cored.dll:无法打开共享对象文件”。

我正在设置一个 Windows 机器来将我在 Linux 上编写的程序移植到 Windows。我所有的 C++ 程序都使用 CMake。在设置了 Git、ssh、CMake 和 MinGW 之后,我编译了一个程序,它除了 C++ 和数学之外不使用任何库并让它运行。然后我安装了 Qt 并克隆了 Mirasol(https://github.com/phma/mirasol;它用于教幼儿数字)并让它编译,但它没有运行。

这是我在 Windows 上的构建脚本。欢迎就安装程序的位置提出建议。直到我告诉 CMake 去哪里找,CMake 才找到 Qt。

#!/bin/sh
#export CMAKE_PREFIX_PATH=/c/Qt/5.13.0/lib/cmake/Qt5
export Qt5_DIR="C:/Qt/5.13.0/mingw73_64/lib/cmake/Qt5"
mkdir -p ~/build/$1
cd ~/build/$1
mkdir -p dbg
mkdir -p rel
mkdir -p ins
cd dbg
cmake -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=~ ~/src/$1
cd ../rel
cmake -GNinja -DCMAKE_INSTALL_PREFIX=~ ~/src/$1
cd ../ins
cmake -GNinja -DCMAKE_INSTALL_PREFIX=/usr/local ~/src/$1

我在 Linux 上的构建脚本位于 http://bezitopo.org/developers.html(我已经添加了 afl 和 Android 构建,它们无关紧要)。

在 Linux 上,它运行良好,“ldd mirasol”产生以下输出:

        linux-vdso.so.1 (0x00007ffdfe6d1000)
        libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f714c35d000)
        libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f714bbf4000)
        libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f714b4a9000)
        libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f714b120000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f714ad82000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f714ab6a000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f714a779000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f714a55a000)
        libGL.so.1 => /usr/lib/x86_64-linux-gnu/libGL.so.1 (0x00007f714a2ce000)
        libpng16.so.16 => /usr/lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f714a09c000)
        libharfbuzz.so.0 => /usr/lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f7149dfe000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7149be1000)
        libicui18n.so.60 => /usr/lib/x86_64-linux-gnu/libicui18n.so.60 (0x00007f7149740000)
        libicuuc.so.60 => /usr/lib/x86_64-linux-gnu/libicuuc.so.60 (0x00007f7149389000)
        libdouble-conversion.so.1 => /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f7149178000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7148f74000)
        libglib-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f7148c5e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f714cdf9000)
        libGLX.so.0 => /usr/lib/x86_64-linux-gnu/libGLX.so.0 (0x00007f7148a2d000)
        libGLdispatch.so.0 => /usr/lib/x86_64-linux-gnu/libGLdispatch.so.0 (0x00007f7148777000)
        libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f71484c3000)
        libgraphite2.so.3 => /usr/lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f7148296000)
        libicudata.so.60 => /usr/lib/x86_64-linux-gnu/libicudata.so.60 (0x00007f71466ed000)
        libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f714647b000)
        libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f7146143000)
        libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f7145f1b000)
        libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f7145d17000)
        libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f7145b11000)
        libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f71458fc000)
        librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f71456f4000)

在 Windows 上,运行它会产生错误

 C:/Users/phma/build/mirasol/dbg/mirasol.exe: error while loading shared libraries: Qt5Widgetsd.dll: cannot open shared object file: No such file or directory

ldd 产生输出

        ntdll.dll => /c/Windows/SYSTEM32/ntdll.dll (0x7ffad3a20000)
        KERNEL32.DLL => /c/Windows/System32/KERNEL32.DLL (0x7ffad3010000)
        KERNELBASE.dll => /c/Windows/System32/KERNELBASE.dll (0x7ffad0e10000)
        msvcrt.dll => /c/Windows/System32/msvcrt.dll (0x7ffad3560000)
        libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
        libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
        USER32.dll => /c/Windows/System32/USER32.dll (0x7ffad2bb0000)
        win32u.dll => /c/Windows/System32/win32u.dll (0x7ffad0c30000)
        GDI32.dll => /c/Windows/System32/GDI32.dll (0x7ffad2e00000)
        gdi32full.dll => /c/Windows/System32/gdi32full.dll (0x7ffad1840000)
        msvcp_win.dll => /c/Windows/System32/msvcp_win.dll (0x7ffad0a60000)
        ucrtbase.dll => /c/Windows/System32/ucrtbase.dll (0x7ffad0b30000)

。它没有说“Qt5Widgetsd.dll => not found”,而且我不知道额外的“d”是从哪里来的。

ETA:我更改了构建脚本以告诉 CMake 使用 MSYS Makefiles 而不是 Ninja。我仍然得到错误。

ETA:我将 DLL 复制到程序编译的目录中,然后它运行。它看起来不规范,来自 Linux,其中库位于 /usr/lib/,但在 Windows 上,在 Kate 二进制文件旁边的 bin 目录中,有许多 DLL。

【问题讨论】:

标签: windows cmake qt5


【解决方案1】:

确保将 dll 的调试版本(查看输出的 d 后缀)放在 EXE 附近(记住 Windows 将“./”添加到 cwd。

d 后缀是因为您构建了一个调试版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 2021-10-02
    • 2022-06-14
    • 2020-03-18
    • 2015-08-29
    相关资源
    最近更新 更多