cmake в Qt5

Устанавливаем cmake (подготовитель сборки). Это альтернатива qmake.exe.

Cmake это свободный бесплатный проект, специализирующийся на кросплатформенной подготовке проектов из одних исходников. Прямого отношения к Qt не имеет. 

Как обычно сначала создаем тестовый проект, где в начале указываем, что будем использовать cmake. Надо отметить, что cmake в отличии от qmake это сторонний продукт для Qt, но так уж сложилось, что свой qmake получился у Qt не очень удобным для разработчиков, точнее Qt-вцы не смогли его допилить до уровня удобства cmake.

Cmake имет свою идеалогию, свою логику. Qt Creator не очень стабильно настраивает работу через cmake. И часто приходится сначала настраивать и собирать проект через командную строку cmake, т.е. без Qt Creator, а потом допиливать настройку cmake в Qt Creator.

Для понимания: Qt Company начиная с Qt версии 6 отказывается от QMake в пользу CMake для сборки самого Qt, то есть в исходниках самого Qt6 уже нет pro и pri файлов.

Главная проблема qmake была в том, что пути к qt (заголовкам,библиотекам и т.д.) сохранялись в самом бинарнике qmake.exe (так себе идея). Но новых идей у Qt не появилось и как следствие взоры разрабов все больше стали смотреть по сторонам - кто как чем собирает проекты на сях.

Пробуем собрать для тестового проекта сделать Rescan Project. Получаем естественно ошибки:

Running C:\Program Files (x86)\CMake\bin\cmake.exe G:/QT/Qt5_projects/cmake/test1 "-GCodeBlocks - NMake Makefiles" "-DCMAKE_BUILD_TYPE:STRING=Debug" "-DCMAKE_CXX_COMPILER:STRING=C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/cl.exe" "-DCMAKE_C_COMPILER:STRING=C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/cl.exe" "-DCMAKE_PREFIX_PATH:STRING=G:/QT/Qt5.14.2/5.14.2/msvc2017" "-DQT_QMAKE_EXECUTABLE:STRING=G:/QT/Qt5.14.2/5.14.2/msvc2017/bin/qmake.exe" in C:\Users\p\AppData\Local\Temp\QtCreator-mCTOTt\qtc-cmake-kbSWEsEP.
-- The CXX compiler identification is MSVC 19.0.24215.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - failed
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/cl.exe - broken
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.20/Modules/CMakeTestCXXCompiler.cmake:59 (message):
  The C   compiler

    "C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/BIN/cl.exe"

  is not able to compile a simple test program.

  It fails with the following output:

    Change Dir: C:/Users/p/AppData/Local/Temp/QtCreator-mCTOTt/qtc-cmake-kbSWEsEP/CMakeFiles/CMakeTmp
    
    Run Build Command(s):nmake -f Makefile /nologo cmTC_325b1\fast && 	"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"  -f CMakeFiles\cmTC_325b1.dir\build.make /nologo -L                  CMakeFiles\cmTC_325b1.dir\build
    Building CXX object CMakeFiles/cmTC_325b1.dir/testCXXCompiler.cxx.obj
    	"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_cl_compile_depends --dep-file=CMakeFiles\cmTC_325b1.dir\testCXXCompiler.cxx.obj.d --working-dir=C:\Users\p\AppData\Local\Temp\QtCreator-mCTOTt\qtc-cmake-kbSWEsEP\CMakeFiles\CMakeTmp --filter-prefix="Note: including file: " -- C:\PROGRA~2\MICROS~1.0\VC\BIN\cl.exe @C:\Users\p\AppData\Local\Temp\nm25F9.tmp
    testCXXCompiler.cxx
    Linking CXX executable cmTC_325b1.exe
    	"C:\Program Files (x86)\CMake\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\cmTC_325b1.dir --rc=rc --mt=CMAKE_MT-NOTFOUND --manifests -- C:\PROGRA~2\MICROS~1.0\VC\bin\link.exe /nologo @CMakeFiles\cmTC_325b1.dir\objects1.rsp @C:\Users\p\AppData\Local\Temp\nm26C5.tmp
    RC Pass 1: command "rc /fo CMakeFiles\cmTC_325b1.dir/manifest.res CMakeFiles\cmTC_325b1.dir/manifest.rc" failed (exit code 0) with the following output:
    The system cannot find the file specifiedNMAKE : fatal error U1077: '"C:\Program Files (x86)\CMake\bin\cmake.exe"' : return code '0xffffffff'
    Stop.
    NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\nmake.exe"' : return code '0x2'
    Stop.
    
    

  

  CMake will not be able to correctly generate this project.
Call Stack (most recent call first):
  CMakeLists.txt:3 (project)


-- Configuring incomplete, errors occurred!
See also "C:/Users/p/AppData/Local/Temp/QtCreator-mCTOTt/qtc-cmake-kbSWEsEP/CMakeFiles/CMakeOutput.log".
See also "C:/Users/p/AppData/Local/Temp/QtCreator-mCTOTt/qtc-cmake-kbSWEsEP/CMakeFiles/CMakeError.log".
CMake process exited with exit code 1.

Некоторые ошибки генерации cmake файлов из креатора

Ошибка

broken CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.20/Modules/CMakeTestCXXCompiler.cmake:59 

Скачиваем новый cmake, ошибка уходит.

Ошибка

Clang Code Model: Error: The clangbackend executable "G:\Qt\Qt5.14.2\Tools\QtCreator\bin\clangbackend.exe" could not be started (timeout after 10000ms).

Каким-то образом сама исчезла.

Ошибка

broken CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.20/Modules/CMakeTestCXXCompiler.cmake:59 

Исправляем cmake_minimum_required(VERSION 2.8...3.13) , смотри 2.8...3.13. Ошибка уходит.

Сборка проекта из креатора

Ошибка 

error: A CMake tool must be set up for building. Configure a CMake tool in the kit options.

Промежуточные итоги

Подготовка с помощью cmake проекта в Qt Creator завершается успешно. Но сборка проекта не получается.

Зайдем с другой стороны. Попробуем из командной строки.

Из командной строки все работает

Успешно собираем из командной строки наш тестовый проект (но только для x86).

::call "G:\QT\Qt5.14.2\5.14.2\msvc2017\bin\qtenv2.bat"

set PATH=G:\QT\Qt5.14.2\5.14.2\msvc2017\bin;%PATH%

call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86

::echo %PATH%
::cmake --help

cmake -G "Visual Studio 17 2022" -A Win32 -S .. -B "build32" -DCMAKE_BUILD_TYPE=Debug
cmake -G "Visual Studio 17 2022" -A x64 -S .. -B "build64"

cmake --build build32 --config Debug
cmake --build build32 --config Release

cmake --build build64 --config Debug
cmake --build build64 --config Release

Вот вывод такой:

G:\QT\Qt5_projects\cmake\test1\bld>call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
QT_LIBRARIES :
Qt5Widgets_LIBRARIES :
Qt_lib :
Qt5Core_INCLUDE_DIRS :
Qt5Gui_INCLUDE_DIRS :
CMAKE_AUTOMOC  : ON
CMAKE_BUILD_TYPE  : Debug
-- Configuring done (0.0s)
-- Generating done (0.3s)
-- Build files have been written to: G:/QT/Qt5_projects/cmake/test1/bld/build32
-- Selecting Windows SDK version 10.0.22621.0 to target Windows 10.0.19045.
QT_LIBRARIES :
Qt5Widgets_LIBRARIES :
Qt_lib :
Qt5Core_INCLUDE_DIRS :
Qt5Gui_INCLUDE_DIRS :
CMAKE_AUTOMOC  : ON
CMAKE_BUILD_TYPE  :
-- Configuring done (0.0s)
-- Generating done (0.3s)
-- Build files have been written to: G:/QT/Qt5_projects/cmake/test1/bld/build64
MSBuild version 17.10.4 10fbfbf2e for .NET Framework

  Automatic MOC and UIC for target test1
  test1.vcxproj -> G:\QT\Qt5_projects\cmake\test1\bld\build32\Debug\test1.exe
MSBuild version 17.10.4 10fbfbf2e for .NET Framework

  Automatic MOC and UIC for target test1
  test1.vcxproj -> G:\QT\Qt5_projects\cmake\test1\bld\build32\Release\test1.exe
MSBuild version 17.10.4 10fbfbf2e for .NET Framework

  Automatic MOC and UIC for target test1
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QCoreApplication::QCoreAppl
ication(int &,char * *,int)" (__imp_??0QCoreApplication@@QEAA@AEAHPEAPEADH@Z) referenced in function main [G:\QT\Qt5_pr
ojects\cmake\test1\bld\build64\test1.vcxproj]
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl QCoreApplication::~
QCoreApplication(void)" (__imp_??1QCoreApplication@@UEAA@XZ) referenced in function main [G:\QT\Qt5_projects\cmake\test
1\bld\build64\test1.vcxproj]
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static int __cdecl QCoreApplication
::exec(void)" (__imp_?exec@QCoreApplication@@SAHXZ) referenced in function main [G:\QT\Qt5_projects\cmake\test1\bld\bui
ld64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Widgetsd.lib : warning LNK4272: library machine type 'x86' conflicts with target
machine type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Guid.lib : warning LNK4272: library machine type 'x86' conflicts with target mach
ine type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Cored.lib : warning LNK4272: library machine type 'x86' conflicts with target mac
hine type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5_projects\cmake\test1\bld\build64\Debug\test1.exe : fatal error LNK1120: 3 unresolved externals [G:\QT\Qt5_pro
jects\cmake\test1\bld\build64\test1.vcxproj]
MSBuild version 17.10.4 10fbfbf2e for .NET Framework

  Automatic MOC and UIC for target test1
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __cdecl QCoreApplication::QCoreAppl
ication(int &,char * *,int)" (__imp_??0QCoreApplication@@QEAA@AEAHPEAPEADH@Z) referenced in function main [G:\QT\Qt5_pr
ojects\cmake\test1\bld\build64\test1.vcxproj]
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __cdecl QCoreApplication::~
QCoreApplication(void)" (__imp_??1QCoreApplication@@UEAA@XZ) referenced in function main [G:\QT\Qt5_projects\cmake\test
1\bld\build64\test1.vcxproj]
main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: static int __cdecl QCoreApplication
::exec(void)" (__imp_?exec@QCoreApplication@@SAHXZ) referenced in function main [G:\QT\Qt5_projects\cmake\test1\bld\bui
ld64\test1.vcxproj]
main.obj : error LNK2001: unresolved external symbol "public: virtual __cdecl QCoreApplication::~QCoreApplication(void)
" (??1QCoreApplication@@UEAA@XZ) [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Widgets.lib : warning LNK4272: library machine type 'x86' conflicts with target m
achine type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Gui.lib : warning LNK4272: library machine type 'x86' conflicts with target machi
ne type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5.14.2\5.14.2\msvc2017\lib\Qt5Core.lib : warning LNK4272: library machine type 'x86' conflicts with target mach
ine type 'x64' [G:\QT\Qt5_projects\cmake\test1\bld\build64\test1.vcxproj]
G:\QT\Qt5_projects\cmake\test1\bld\build64\Release\test1.exe : fatal error LNK1120: 4 unresolved externals [G:\QT\Qt5_p
rojects\cmake\test1\bld\build64\test1.vcxproj]

Но уже становится понятно, что проект может собираться для варианта win32.

Qt Creator успешно увидел cmake

Может и у вас поначалу получится так, что много Qt Creator-ов и много MSVC (на винде), а работает только один набор: у нас например сразу заработал только такой вариант:

Qt Creator 12.0.0 
	Based on Qt 6.6.0 (MSVC 2019, x86_64)
	Built on Nov 22 2023 07:38:51
	
Desktop (x86-windows-msvc2019-pe-64bit)
qmake path: C:\Qt6\5.15.2\msvc2019_64\bin\qmake.exe

Кстати скачать можно без vpn здесь: https://qt.mirror.constant.com/official_releases/qtcreator/12.0/12.0.0/