我只找到人们想要静态链接Qt而不是通过cmake动态链接Qt的问题的答案。所以我真的想知道为什么我一个人有这个问题。
也许是因为我使用MSVC2017 Qt 5.12 Kit而不是MinGW。
这些是我的CMake文件:只是一个空白的Qt / QML主文件,另一个库中有一个伪QObject类。如果我构建lib STATIC,一切都很好,但是当我尝试构建SHARED时,我在下面的错误消息中看到了,cmake创建了一个构建命令,该命令还静态地链接了Qt库。
我不希望将其用于许可证选项。如果我的库静态链接可以,但Qt不能。
所有Qt库都可以在D:\ Dev \ Qt.5.12 \ 5.12.0 \ msvc2017_64 \ bin中以dll的形式使用-所以我看不到问题。如果这里有人有一个主意,那就太好了。
可执行CMakeLists.txt:
cmake_minimum_required(VERSION 3.1)
project(DCTest LANGUAGES CXX)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Core Quick REQUIRED)
add_subdirectory(lib)
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/lib")
add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc")
target_compile_definitions(${PROJECT_NAME} PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::Core Qt5::Quick qmlsightlinesolver2d)
库CMakeLists.txt:(lib也应独立构建,这就是为什么它具有所有选项的原因)
cmake_minimum_required(VERSION 3.1)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 COMPONENTS Core Quick REQUIRED)
// All builds and runs fine (but still statically) when I put STATIC here
add_library(qmlsightlinesolver2d SHARED "qmlsightlinesolver2d.h" "qmlsightlinesolver2d.cc")
target_compile_definitions(qmlsightlinesolver2d PRIVATE $<$<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>:QT_QML_DEBUG>)
target_link_libraries(qmlsightlinesolver2d PRIVATE Qt5::Core Qt5::Quick)
编译输出:
00:04:04: Running steps for project DCTest...
00:04:04: Starting: "C:\Program Files (x86)\CMake\bin\cmake.exe" --build . --target all
[1/10 23.7/sec] Automatic MOC for target qmlsightlinesolver2d
[2/10 2.3/sec] Building CXX object lib\CMakeFiles\qmlsightlinesolver2d.dir\qmlsightlinesolver2d.cc.obj
[3/10 3.4/sec] Building CXX object lib\CMakeFiles\qmlsightlinesolver2d.dir\qmlsightlinesolver2d_autogen\mocs_compilation.cpp.obj
[4/10 3.2/sec] Linking CXX shared library lib\qmlsightlinesolver2d.dll
LINK : lib\qmlsightlinesolver2d.dll not found or not built by the last incremental link; performing full link
[5/10 3.8/sec] Automatic MOC for target DCTest
[6/10 4.4/sec] Automatic RCC for qml.qrc
[7/10 4.8/sec] Building CXX object CMakeFiles\DCTest.dir\DCTest_autogen\mocs_compilation.cpp.obj
[8/10 5.5/sec] Building CXX object CMakeFiles\DCTest.dir\DCTest_autogen\EWIEGA46WW\qrc_qml.cpp.obj
[9/10 3.7/sec] Building CXX object CMakeFiles\DCTest.dir\main.cpp.obj
[10/10 3.9/sec] Linking CXX executable DCTest.exe
FAILED: DCTest.exe
cmd.exe /C "cd . && "C:\Program Files (x86)\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\DCTest.dir --manifests -- C:\PROGRA~2\MIB055~1\2017\COMMUN~1\VC\Tools\MSVC\1416~1.270\bin\Hostx86\x64\link.exe /nologo CMakeFiles\DCTest.dir\main.cpp.obj CMakeFiles\DCTest.dir\DCTest_autogen\mocs_compilation.cpp.obj CMakeFiles\DCTest.dir\DCTest_autogen\EWIEGA46WW\qrc_qml.cpp.obj /out:DCTest.exe /implib:DCTest.lib /pdb:DCTest.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Quickd.lib lib\qmlsightlinesolver2d.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Qmld.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Networkd.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Guid.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Cored.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~2\MIB055~1\2017\COMMUN~1\VC\Tools\MSVC\1416~1.270\bin\Hostx86\x64\link.exe /nologo CMakeFiles\DCTest.dir\main.cpp.obj CMakeFiles\DCTest.dir\DCTest_autogen\mocs_compilation.cpp.obj CMakeFiles\DCTest.dir\DCTest_autogen\EWIEGA46WW\qrc_qml.cpp.obj /out:DCTest.exe /implib:DCTest.lib /pdb:DCTest.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Quickd.lib lib\qmlsightlinesolver2d.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Qmld.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Networkd.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Guid.lib D:\Dev\Qt.5.12\5.12.0\msvc2017_64\lib\Qt5Cored.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\DCTest.dir/intermediate.manifest CMakeFiles\DCTest.dir/manifest.res" failed (exit code 1104) with the following output:
LINK : DCTest.exe not found or not built by the last incremental link; performing full link
LINK : fatal error LNK1104: cannot open file 'lib\qmlsightlinesolver2d.lib'
ninja: build stopped: subcommand failed.
00:04:06: The process "C:\Program Files (x86)\CMake\bin\cmake.exe" exited with code 1.
Error while building/deploying project DCTest (kit: Desktop Qt 5.12.0 MSVC2017 64bit)
The kit Desktop Qt 5.12.0 MSVC2017 64bit has configuration issues which might be the root cause for this problem.
When executing step "CMake Build"
00:04:06: Elapsed time: 00:03.