CMakeList基础
@ sasaba | 星期五,十一月 12 日,2021 年 | 1 分钟阅读 | 更新于 星期五,五月 13 日,2022 年

简单介绍一下CMakeList.txt的使用。

一个简单的示例:

cmake_minimum_required(VERSION 3.17)
project(hasp_test C)


include_directories(./include)
link_directories(./lib)
#add_library(hasp_test SHARED main.c)

add_executable(hasp_test main.c)
target_link_libraries(hasp_test libhasp_windows_x64.a)

详细解析

cmake_minimum_required

# 该命令指明了对cmake的最低(高)版本的要求,...为低版本和高版本之间的连接符号,没有其他含义。
cmake_minimum_required(VERSION <min>[...<max>] [FATAL_ERROR])

set

# 用来设置环境变量
set(<variable> <value>... [PARENT_SCOPE])

include_directories

可以将项目使用的头文件导入然后在c文件中只需要直接includeheader文件即可。

// 原来是
#include "lib/xxx.h"

// 现在可以
#include "xxx.h"

link_directories

引入项目的静态库或者动态库的目录。

add_library

将项目导出为库。

# 导出为静态库 比如libxxx.a
add_library(hasp_test STATIC main.c)

# 导出为动态库 比如libxxx.so 或者 libxxx.dll
add_library(hasp_test SHARED main.c)

add_executable

# 增加编译为可执行函数, 左边是项目名, 右边是源文件
add_executable(hasp_test "main.c")

target_link_libraries

引入项目所需要的的库。

# 定义
target_link_libraries(<target> ... <item>... ...)
target表示项目的名称 item是库

# 引入了lib目录下的静态库libhasp_windows_x64.a
target_link_libraries(hasp_test libhasp_windows_x64.a)

# 引入ws2_32.lib
target_link_libraries(hasp_test ws2_32)

add_subdirectory

常用于引入submodule的lib。

# 定义
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

add_subdirectory(numcpp)

# 后文可以直接使用submodule的工程
target_link_libraries(${PROJECT_NAME} PRIVATE NumCpp::NumCpp)

流程控制

简单的if语句

if(MINGW)
    target_link_libraries(hasp_test ws2_32)
endif()

QA

怎么使用gui查看dll依赖

Dependencies

对于某个lib mingw使用libstdc++.dll的问题

target_link_libraries(${LIB_NAME} -static stdc++ -dynamic)