本人主要从事QT开发工作,目前由于版本升级,为适应新版本开发,学习CMake。
以下为学习CMake的一些笔记,项目目录结构如图:
CMakeLists.txt中内容为:
cmake_minimum_required(VERSION 3.5)
project(qml_camke LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(cf_example_VERSION_MAJOR 1)
set(cf_example_VERSION_MINOR 0)
set(cf_example_VERSION_PATCH 1)
set(cf_example_VERSION "${cf_example_VERSION_MAJOR}.${cf_example_VERSION_MINOR}.${cf_example_VERSION_PATCH}")
set(cf_log "log.txt")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
function(add_numbers num1 num2)
math(EXPR result "${num1} + ${num2}")
message("the result is ${result}")
endfunction()
add_numbers(1 2)
find_package(Boost 1.83 REQUIRED COMPONENTS filesystem system)
if(Boost_FOUND)
message("boost found")
else()
message(FATAL_ERROR "Connot find Boost")
endif()
configure_file(ver.h.in ${PROJECT_BINARY_DIR}/ver.h)
configure_file(readme ${CMAKE_CURRENT_SOURCE_DIR}/readme)
find_package(Qt5 COMPONENTS Core Quick REQUIRED)
file(GLOB SOURCES "*.cpp"
"*.h"
"*.qrc"
"include/*.h"
"log/*"
)
set(ALL_SRCS ${SOURCES})
add_executable(qml_camke ${ALL_SRCS})
target_link_libraries(qml_camke
PRIVATE
Qt5::Core
Qt5::Quick
Boost::filesystem
)
set(LIB_SOUCE
"lib/libhello_library.a"
)
target_link_libraries(qml_camke
PRIVATE
${PROJECT_SOURCE_DIR}/${LIB_SOUCE}
${PROJECT_SOURCE_DIR}/lib/libCHello_library.so
)
笔记解析:
1.必须设置CMake版本 cmake_minimum_required(VERSION 3.5)
2.设置项目名称 project(qml_camke LANGUAGES CXX)
#与QT相关,进行以下设置
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#设置C++版本
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#找到相应库
find_package(Boost 1.83 REQUIRED COMPONENTS filesystem system)
#链接相应库
target_link_libraries(qml_camke PRIVATE Boost::filesystem)
//同样的链接自定义库,动态库和静态库一样的方法
set(LIB_SOUCE "lib/libhello_library.a")
target_link_libraries(qml_camke PRIVATE
/home/li/lsy/cmakeCode/Day02/
/home/li/lsy/cmakeCode/Day02/lib/libCHello_library.so
)
3.目前使用的是此方法加入所有资源文件, | 还有其他方法:set(SOURCES src/Hello main.cpp)
file(GLOB SOURCES "*.cpp" |
"*.h" |
"*.qrc" |
"include/*.h" |
"log/*" |
) |
设置输出文件,编译文件 add_executable(qml_camke )
#编译静态库 add_library(hello_library STATIC )
#编译动态库 add_library(hello_library SHARED )
//设置输出路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY /home/li/lsy/cmakeCode/Day02/bin)
#加入其他文件 前面的是自动生成的文件,后面的是自己添加近来的文件
configure_file("readme" /home/li/lsy/cmakeCode/Day02/"readme")
#include_directories(dir1 dir2 ...) //用于指定包含头文件目录,以便在变异过错中能够正确的找到和包含目录中的头文件,
//应该在add_executable或add_library之前
//仅仅告诉编译器在那些目录查找头文件,并不主动包含这些头文件
//推荐使用CMake的相对路径,以增强可移植性
set(CMAKE_BUILD_TYPE Debug) //可换为Release //设置生成类型为Debug
//判断
if(……)
……
elseif(……) //else()
……
endif()
//函数
function(add_numbers num1 num2)
math(EXPR result " + ")
message("the result is &{result}")
endfunction()
//调用
add_numbers(1 2)
//构建子项目
//子项目sub1 sub2
//每个子项目都包含自身CMakeListstxt,设置project(sub1) project(sub2)
//主项目写以下语句进行包含
add_subdirectory(sub1)
add_subdirectory(sub2)
本人刚学不久,后面会好好研究。