【问题标题】:Problem with static Qt linking (MSVC2017)静态 Qt 链接问题 (MSVC2017)
【发布时间】:2019-12-22 10:48:56
【问题描述】:

首先我要说的是,一切都可以通过在线安装程序的标准 Qt 库进行编译、链接和完美运行

让我们开始吧 我希望我的应用程序独立运行(仅 exe 文件)。我已经下载并设置了 tesseract、leptonica 和依赖库。只有 Qt 保持动态。然后我阅读了很多关于如何使其成为静态的说明。我从这个page 到处下载了qt。使用以下命令编译它: configure -static -release -platform win32-msvc nmake nmake install

然后我用带有编译静态库的新 Qt/5.13 路径替换了 Qt/5.13/msvc 路径

这是我的 cmake 文件(我在 Clion 中编码,因为我讨厌 Visual Studio IntelliSens 的选项卡自动完成而不是 enter)

#set(CMAKE_VERBOSE_MAKEFILE ON)
cmake_minimum_required(VERSION 3.14)
project(OWStreamRecordEx)
set(CMAKE_CXX_STANDARD 17)

set(CMAKE_PREFIX_PATH ${VCPKG}/installed/x64-windows-static;${QT}/lib/cmake)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)

find_package(Tesseract REQUIRED)
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Widgets REQUIRED)

include_directories(${VCPKG}/installed/x64-windows-static/include)
include_directories(${QT}/include)

set(CompilerFlags
        CMAKE_CXX_FLAGS
        CMAKE_CXX_FLAGS_DEBUG
        CMAKE_CXX_FLAGS_RELEASE
        CMAKE_C_FLAGS
        CMAKE_C_FLAGS_DEBUG
        CMAKE_C_FLAGS_RELEASE
        )
foreach(CompilerFlag ${CompilerFlags})
    string(REPLACE "/MDd" "/MTd" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
add_executable(OWStreamRecordEx src/main.cpp src/mainwindow.cpp src/mainwindow.h src/mainwindow.ui src/ScreenShooter.cpp src/ScreenShooter.h src/SHMEMReader.cpp src/SHMEMReader.h src/VisionThread.cpp src/VisionThread.h)

target_link_libraries(OWStreamRecordEx Qt5::Core)
target_link_libraries(OWStreamRecordEx Qt5::Gui)
target_link_libraries(OWStreamRecordEx Qt5::Widgets)
target_link_libraries(OWStreamRecordEx libtesseract)

QT 和 VCPKG 由 cmake 参数定义 -DVPCKG=...

最后我的问题是它没有链接:

LINK : fatal error LNK1104: cannot open file 'C:\Program.obj'

而且,我必须澄清一切都适用于常规 qt

UPD1:链接日志

LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2017\COMMUN~1\VC\Tools\MSVC\1416~1.270\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\OWStreamRecordEx.dir\objects1.rsp /out:OWStreamRecordEx.exe /implib:OWStreamRecordEx.lib /pdb:D:\Evgeny\Documents\DEV\ProjectsQt\OWStreamRecordEx\cmake-build-debug\OWStreamRecordEx.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\mpr.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\netapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\userenv.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\version.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ws2_32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\kernel32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\shell32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\uuid.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\advapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\winmm.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\mpr.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\netapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\userenv.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\version.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ws2_32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\kernel32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\shell32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\uuid.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\advapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\winmm.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\mpr.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\netapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\userenv.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\version.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ws2_32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\kernel32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\shell32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\uuid.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\advapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\winmm.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\mpr.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\netapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\userenv.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\version.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ws2_32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\kernel32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\user32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\shell32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\uuid.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\ole32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\advapi32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\winmm.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\shell32.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\uxtheme.lib C:\Program Files (x86)\Windows Kits\10\lib\10.0.18362.0\um\x86\dwmapi.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib ws2_32.lib ole32.lib uuid.lib user32.lib advapi32.lib D:\Qts\Qt-5.13.0\lib\Qt5Core.lib D:\Qts\Qt-5.13.0\lib\Qt5Gui.lib D:\Qts\Qt-5.13.0\lib\Qt5Widgets.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\tesseract41d.lib D:\Qts\Qt-5.13.0\lib\Qt5Gui.lib D:\Qts\Qt-5.13.0\lib\Qt5Core.lib D:\Qts\Qt-5.13.0\lib\Qt5Gui.lib D:\Qts\Qt-5.13.0\lib\qtlibpng.lib D:\Qts\Qt-5.13.0\lib\Qt5Core.lib D:\Qts\Qt-5.13.0\lib\qtpcre2.lib D:\Qts\Qt-5.13.0\lib\qtharfbuzz.lib Ws2_32.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\leptonica-1.76.0d.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\gif.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\jpegd.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\libpng16d.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\tiffd.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\lzmad.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\jpegd.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\libpng16d.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\tiffd.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\lzmad.lib D:\Evgeny\Documents\DEV\vcpkg\installed\x64-windows-static\debug\lib\zlibd.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\OWStreamRecordEx.dir/intermediate.manifest CMakeFiles\OWStreamRecordEx.dir/manifest.res" failed (exit code 1104) with the following output:

UPD2:

我用“”手动替换了所有程序文件,这个错误已经消失了,但是出现了新的错误,当链接 Qt5Core 时它说

Qt5Core.lib(qarraydata.obj) : fatal error LNK1112: module machine type 'x86' conflicts with target machine type 'x64'

如果我在 x64 机器上使用 x64 msvc 编译 Qt,这怎么可能?

UPD3:

好的,我将尝试使用 x64 参数再次重建 qt。这将需要很长时间(如 8 小时)。希望对你有帮助

【问题讨论】:

  • 我的通灵能力表明C:\Program Files\Library\Foo.lib 形式的某些东西正在传递给链接器,但它缺少引号"" 所以链接器看到c:\Program 并尝试直接链接到它。
  • @selbie 是的,就像所有指南所说的那样。但是我的 Qt 和 VCPKG 在 D: 驱动器上,所以没有带有 c:program 的 qt 或 tesseract 库
  • @selbie 我应该将 Visual Studio 文件重新安装到名称中没有空格的目录中吗?或者我该如何解决这个问题
  • CMake 如何推断 Visual Studio 安装目录和要链接的标准 win32 .lib 文件桶?一旦你知道了,这应该是一个简单的修复。

标签: c++ qt cmake clion


【解决方案1】:

尝试,而不是

set(CMAKE_PREFIX_PATH ${QT}/lib/cmake)

list(APPEND CMAKE_PREFIX_PATH "${QT}/lib/cmake")

,甚至可能

list(APPEND CMAKE_PREFIX_PATH "${QT}\\lib\\cmake")

【讨论】:

    猜你喜欢
    • 2017-12-08
    • 2020-01-13
    • 2011-09-20
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多