【发布时间】: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 文件桶?一旦你知道了,这应该是一个简单的修复。