CMake教程——零碎笔记

多系统区分

if(WIN32)
    # todo: windows action
elseif(APPLE)
    # todo: mac action
elseif(UNIX)
    # todo: linux action
endif()

windows下x64和x86区分

if(WINDOWS)
    if(CMAKE_CL_64)
        target_link_libraries (BarcodeReader "DBRx64")
    else()
        target_link_libraries (BarcodeReader "DBRx86")
    endif()
else()
    target_link_libraries (BarcodeReader "DynamsoftBarcodeReader")
endif()

设置构建类型

#set(CMAKE_BUILD_TYPE "Release")
#set(CMAKE_BUILD_TYPE "Debug")
#set(CMAKE_BUILD_TYPE "MinSizeRel")
#set(CMAKE_BUILD_TYPE "RelWithDebInfo")

编译选项

 add_definitions(-Wall)

可以通过add_definitions(xxx)设置编译选项, 常见编译选项列表:

  1. -w: 关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。
  2. -Wall: 编译后显示所有警告。
  3. -W: 类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。

TARGET的库属性设置

仅仅有静态
IMPORT_LOCATION=lib路径

有动态库且静态库作为链接:
IMPORTED_IMPLIB=lib路径
IMPORTED_LOCATION=dll路径

// 区分操作系统cpu架构, include 得在project下面
project(smt-logger-test VERSION 0.1.0)
include(CMakeDetermineSystem)

用于寻找依赖库

include(CMakeFindDependencyMacro)
find_dependency(Threads)

给Window的Debug版本加后缀

if(MSVC)
set(CMAKE_DEBUG_POSTFIX "d")
endif()

判断系统版本

project(app)
include(CMakeDetermineSystem)

生成带版本的so文件

SET_TARGET_PROPERTIES(taos PROPERTIES VERSION 1.6.0.0 SOVERSION 1)
此时会生成如下文件:

libtaos.so -> libtaos.so.1*
libtaos.so.1 -> libtaos.so.1.6.0.0*
libtaos.so.1.6.0.0

Copy Qt DLL

COMMAND ${CMAKE_COMMAND} -E copy_if_different
    $
    $
    ... etc ...

打印CMake表达式的值

add_custom_command(TARGET Test POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Runtime Dlls: $")

add_custom_command(TARGET Test POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "Target File: $")

调试查看CMake的表达式值

拷贝当前项目中别的模块生成的DLL库到example模块里

target_link_libraries(${PROJECT_NAME} PRIVATE
    library1
    library2)

# Copy the output dll files  from library1 and library2 to current module's exe path.
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
    $
    $)

这个功能必须cmake版本高于3.21以上才支持

让VSCode默认以ninja作为默认构建系统

.vscode/settings.json:

{
    "cmake.generator": "Ninja"
}

让cmake帮忙自动生成库依赖图

# Generate deppendency graphic.
find_program(DOT_EXE dot)
if (DOT_EXE)
    add_custom_target(graphviz ALL
        COMMAND ${CMAKE_COMMAND} "--graphviz=dependencies.dot" .
        COMMAND dot -Tpng dependencies.dot -o dependencies.png
        WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
endif()

dot是一个能将dot文件转为png图片的应用软件,下载地址:Graphviz

CMake常见表达式

$: 获取目标target所在的目录
$:获取目标 target 的完整路径和文件名
$:获取目标 target 在链接过程中使用的库文件的完整路径和文件名
$:在 UNIX 系统上,获取目标 target 的 shared library 共享对象的名称
$:获取目标 target 的属性 prop 的值
$:获取目标 target 的文件名(不包括路径)
$:获取目标 target 在链接过程中所使用的库文件的文件名(不包括路径)

你可能感兴趣的:(CMake教程——零碎笔记)