背景:工作需求,最近开始接触cmake,由于之前都是用makefile管理工程的,所以一下适应不了,在网上找了一圈,自己整理了一个完整的用cmake管理的工程,废话少说,上菜。
1. 工程tree图
对整个工程目录结构做简单的说明:
1> 顶层目录
其中how_to_generate_sharedLibrary目录是用来生成动态库的示例
thirdparty中存放了生成动态库的头文件和.so文件
2. 各级CMakeLists.txt讲解
1> 顶层CMakeLists.txt讲解
cmake_minimum_required(VERSION 3.5) project(HelloWorld) set(CMAKE_C_STANDARD 99) include_directories(hello/include world/include thirdparty/include) link_directories(thirdparty/lib) set(DIR_SRCS ./src/main.c) add_subdirectory(hello) add_subdirectory(world) add_executable(HelloWorld ${DIR_SRCS}) LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/thirdparty/lib) target_link_libraries(HelloWorld hello world calc_library)
逐行解释如下:
// 指定cmake最小可以接受的版本 cmake_minimum_required(VERSION 3.5) //指定project名字 project(HelloWorld) // 用set可以设置变量值,这里指定尊书c99标准 set(CMAKE_C_STANDARD 99) //指定要包含的头文件路径,这里指出了路径,后面在代码中就可以直接用一层包含头文件就可以了 // 不需要在类似中的包含 #include “…/include/xxx.h”; // 直接 #include "xxx.h"即可 include_directories(hello/include world/include thirdparty/include) // 指定链接动态库的路径 link_directories(thirdparty/lib) // 设定DIR_SRCS变量值为 ./src/main.c set(DIR_SRCS ./src/main.c) // 进入子文件夹hello,去执行子文件夹下的CMakeLists.txt add_subdirectory(hello) // 指定生成的项目名为HelloWorld,DIR_SRCS为其所依赖的源文件 add_executable(HelloWorld ${DIR_SRCS})
2> hello子文件夹CMakeLists.txt分析
include_directories(./include) set(DIR_SRCS ./src/hello.c) add_library(hello SHARED ${DIR_SRCS})
子文件夹下不需要再指定cmake版本,编译器版本等
world子文件夹与其类似,不再分析
3. how_to_generate_sharedLibrary — cmake生成动态库以及使用
各个不同的部门之间会存在技术壁垒,或者说分工明确,部门之间不开放源代码,就会给对方一个库和头文件即可
3.1 tree图
3.2 CMakeLists.txt分析
cmake_minimum_required(VERSION 3.5) project(calc_library) # 根据库文件代码生成动态库 add_library(calc_library SHARED src/calc.c) # 创建动态库别名 add_library(calc::library ALIAS calc_library) # 包含指定头文件所在的目录 target_include_directories(calc_library PUBLIC ${PROJECT_SOURCE_DIR}/include) # 创建可执行程序 add_executable(calc_binary src/main.c ) # 链接动态库文件 target_link_libraries(calc_binary PRIVATE calc::library)
4. thirdparty文件夹
thirdparty文件夹下分两个文件夹include 和 lib,分别存放头文件和.so库文件
…