参考:【公开课】现代CMake高级教程
https://www.bilibili.com/video/BV16P4y1g7MH/?vd_source=194db66f1a1ec19114918f47f37945aahttps://www.bilibili.com/video/BV16P4y1g7MH/?vd_source=194db66f1a1ec19114918f47f37945aa1、传统的 CMake 软件构建/安装方式
mkdir build # 先创建 build 目录
cd build # 切换到 build 目录
cmake .. # 在 build 目录运行 cmake <源码目录> 生成 Makefile
make -j4 # 调用本地的构建系统 make,开始真正的构建(4进程并行)
sudo make install # 让本地的构建系统执行安装步骤
cd .. # 回到源码目录
2、现代CMake提供了更方便的 -B 和 --build 指令,不同平台,统一命令
cmake -B build # 在源码目录用 -B 直接创建 build 目录并生成 build/Makefile
cmake --build build -j4 # 自动调用本地的构建系统在 build 里构建,即:make -C build -j4
sudo cmake --build build --target install # 调用本地的构建系统执行 install 这个目标,即:安装
cmake -B build
免去了先创建 build
目录再切换进去再指定源码目录的麻烦。
cmake --build build
统一了不同平台(Linux 上会调用 make,Windows 上调用 devenv.exe)
结论:从现在开始,如果在命令行操作 cmake,请使用更方便的 -B
和 --build
命令。
3、如果生成Release,在CMakeLists.txt
中设置,Debug同理。
SET(CMAKE_BUILD_TYPE "Release")
4、cmake指定编译器,在CMakeLists.txt
中设置。
set(CMAKE_C_COMPILER "/usr/local/bin/gcc")
set(CMAKE_CXX_COMPILER "/usr/local/bin/g++")
5、完整CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(Knowledge)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
#VS的MSVC编译器C++版本命令,为了使用C++20标
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive- /Zc:__cplusplus")
#找到Qt6包,为了下面使用Qt的cmake命令
find_package(Qt6 REQUIRED COMPONENTS Quick Widgets)
else()
#找到Qt6包,为了下面使用Qt的cmake命令
#SET(CMAKE_BUILD_TYPE "Release")
find_package(Qt6 REQUIRED COMPONENTS Quick Widgets)
endif()
#qt的cmake命令标准
qt_policy(SET QTP0001 NEW)
qt_standard_project_setup()
#qt的cmake语法将文件加载到项目中
file(GLOB_RECURSE Header_FILES ${CMAKE_CURRENT_SOURCE_DIR}/HeaderFiles/*.h)
file(GLOB_RECURSE CPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/SourceFiles/*.cpp)
file(GLOB_RECURSE EntityHeader_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Entity/*.h)
file(GLOB_RECURSE EntityCPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/Entity/*.cpp)
file(GLOB_RECURSE SQLITECPP_FILES ${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/sqlite/source/*.c)
file(GLOB_RECURSE QML_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/QmlFiles/*.qml)
qt_add_executable(${PROJECT_NAME} SourceFiles/main.cpp)
qt_add_qml_module(${PROJECT_NAME}
URI Knowledge
VERSION 1.0
SOURCES ${Header_FILES} ${CPP_FILES} ${EntityHeader_FILES} ${EntityCPP_FILES} ${SQLITECPP_FILES}
QML_FILES ${QML_FILES})
#去除控制台
set_target_properties(${PROJECT_NAME} PROPERTIES
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE)
target_link_libraries(${PROJECT_NAME} PRIVATE Qt6::Widgets Qt6::Quick)
#rttr
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/rttr-master/src)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/rttr_core_d.lib")
else()
file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/rttr_core.lib")
endif()
target_link_libraries(${PROJECT_NAME} PRIVATE ${rttr})
else()
file(GLOB rttr "${CMAKE_CURRENT_SOURCE_DIR}/lib/rttr/librttr_core.dll.a")
target_link_libraries(${PROJECT_NAME} PRIVATE ${rttr})
endif()
#sqlite
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartySource/sqlite/include)
#halcon
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartyInclude/halcon)
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
file(GLOB Halcon "${CMAKE_CURRENT_SOURCE_DIR}/lib/halcon/*.lib")
target_link_libraries(${PROJECT_NAME} PRIVATE ${Halcon})
else()
endif()
#rapidjson
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ThirdpartyInclude)
#opencv
if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
set(opencv_world "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv/opencv_world460$<$<CONFIG:Debug>:d>.lib")
target_link_libraries(${PROJECT_NAME} PRIVATE ${opencv_world})
else()
file(GLOB opencv_world "${CMAKE_CURRENT_SOURCE_DIR}/lib/opencv/libopencv_world490.dll.a")
target_link_libraries(${PROJECT_NAME} PRIVATE ${opencv_world})
endif()