Cmake快速入门

简介: Cmake快速入门

一、cmake编译

由于cmake过程会⽣成了⼀些⽆法⾃动删除的中间⽂件,所以一般选择第二种方式

在当前工程目录下

mkdir build
cd build 
cmake ..
make

二、单个目录构建可执行文件

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程,他不是执行文件名
PROJECT(test)
# 手动加入文件 ${变量名}} ,比如${SRC_LIST}
SET(SRC_LIST main.c)
SET(SRC_LIST2 main2.c)
# MESSAGE和echo类似 
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
# 生产执行文件名test1  test2
ADD_EXECUTABLE(test1 ${SRC_LIST})
ADD_EXECUTABLE(test2 ${SRC_LIST2})

三、单个目录 添加库

添加头文件目录、添加链接库目录、引用动态库\静态库

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
PROJECT(0VOICE)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
# 添加头文件目录
INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
# 添加链接库目录
LINK_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/lib")
# 引用动态库
ADD_EXECUTABLE(darren  ${SRC_LIST})
TARGET_LINK_LIBRARIES(darren Dir1)
#下面方式是强制找静态库
#TARGET_LINK_LIBRARIES(darren libDir1.a)
#TARGET_LINK_LIBRARIES(darren lDir1)

四、多级目录

根目录下的CMakeLists.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
PROJECT(TEST)
ADD_SUBDIRECTORY(src bin)
MESSAGE(STATUS "TOP CMAKE_CURRENT_SOURCE_DIR -> " ${CMAKE_CURRENT_SOURCE_DIR})
#INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake/0voice)
#INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake/0voice)

src目录下的CMakeLists.txt

# 单个目录实现
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 工程
# PROJECT(TEST)
# 手动加入文件
SET(SRC_LIST main.c)
MESSAGE(STATUS "THIS IS BINARY DIR " ${PROJECT_BINARY_DIR})
MESSAGE(STATUS "THIS IS SOURCE DIR " ${PROJECT_SOURCE_DIR})
#设置子目录
set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")
foreach(SUB_DIR ${SUB_DIR_LIST})
    #遍历源文件
    aux_source_directory(${SUB_DIR} SRC_LIST)
    MESSAGE(STATUS "SUB_DIR-> " ${SUB_DIR})
    MESSAGE(STATUS "SRC_LIST-> " ${SRC_LIST})
endforeach()
# 添加头文件路径
INCLUDE_DIRECTORIES("dir1")
INCLUDE_DIRECTORIES("dir2")
ADD_EXECUTABLE(darren ${SRC_LIST} )
# 将执行文件安装到bin目录
INSTALL(TARGETS darren RUNTIME DESTINATION bin)

五、常用指令

1.PROJECT 设置工程名

Cmake命令之project介绍

project (mytest)

2.INCLUDE_DIRECTORIES 添加头文件目录

添加头文件路径

INCLUDE_DIRECTORIES("${CMAKE_CURRENT_SOURCE_DIR}/dir2")

3.LINK_DIRECTORIES 添加链接库目录

LINK_DIRECTORIES(/home/myproject/libs)

把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了

4.TARGET_LINK_LIBRARIES 添加链接库

LINK_DIRECTORIES把该路径添加到第三方库搜索路径中,这样就可以使用相对路径了,使用TARGET_LINK_LIBRARIES的时候,只需要给出动态链接库的名字就行了,比如:

????

TARGET_LINK_LIBRARIES(MyApp -lcurl )

对于这种,写的是dir1,实际上链接的是libdir1.a或libdir1.so

TARGET_LINK_LIBRARIES(darren dir1 dir2)

如果没写明白是libdir1.so还是libdir1.a,会优先链接动态库 (可以通过ldd命令查看链接状态,能查到状态就是链接了动态库,否则就是静态库)

或者加上l,也算是用静态库,(但是有so文件存在的情况,就会出现问题)

  • 直接输入Dir1,默认用动态库
  • libDir1.a,libDir1.so 用指定的静态或动态库
  • lDir1,使用静态库,如果出现同名的动态库会报错

5.AUX_SOURCE_DIRECTORY

AUX_SOURCE_DIRECTORY(. DIR_SRCS)

就是把 指定目录的所有文件全部添加到变量DIR_SRCS,上面用的是".",也就是把当前目录所有内容全部加入到DIR_SRCS里面

6.ADD_LIBRARY

生成动态库(使用SHARED)

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

就可以构建一个libhello.so的动态库了



生成静态库(使用STATIC)

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC})

就可以构建一个libhello_static.a 的静态库了



使用 ADD_LIBRARY 并没有指定库类型的情况下,默认编译生成的库都是静态库

ADD_LIBRARY(hello_static ${LIBHELLO_SRC})

7.ADD_SUBDIRECTORY

添加一个子目录并构建该子目录

也就是说,除了会执行当前目录里的CMakeLists.txt,会执行ADD_SUBDIRECTORY子目录里面的CMakeLists.txt

Cmake命令之add_subdirectory介绍

六、常用变量

设置库输出路径

SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})


相关文章
|
弹性计算 容器 RDMA
在Kubernetes上使用RDMA
### RDMA RDMA(全称RemoteDirect Memory Access) 它为了解决网络传输中服务器端数据处理的延迟而产生。 它的原理是将待传输的数据从一台计算机的内存,直接传输到另一台计算机的内存,整个传输过程无需操作系统和协议栈的介入。
11347 0
|
Rust 前端开发 JavaScript
Tauri 开发实践 — Tauri 日志记录功能开发
本文介绍了如何为 Tauri 应用配置日志记录。Tauri 是一个利用 Web 技术构建桌面应用的框架。文章详细说明了如何在 Rust 和 JavaScript 代码中设置和集成日志记录,并控制日志输出。通过添加 `log` crate 和 Tauri 日志插件,可以轻松实现多平台日志记录,包括控制台输出、Webview 控制台和日志文件。文章还展示了如何调整日志级别以优化输出内容。配置完成后,日志记录功能将显著提升开发体验和程序稳定性。
1048 1
Tauri 开发实践 — Tauri 日志记录功能开发
|
域名解析 网络协议 Ubuntu
dig 命令深入学习
dig 命令(Domain Information Groper)是一个用于查询 DNS (域名系统)记录的强大工具,它提供了详细的DNS信息,主要用于帮助用户诊断、调试和验证与域名解析相关的问题。
|
机器学习/深度学习 人工智能 Serverless
👉「免费满血DeepSeek实战-联网搜索×Prompt秘籍|暨6平台横评」
满血 DeepSeek 免费用!支持联网搜索!创作声明:真人攥写-非AI生成,Written-By-Human-Not-By-AI
6955 11
👉「免费满血DeepSeek实战-联网搜索×Prompt秘籍|暨6平台横评」
|
网络协议 开发者 Python
Socket如何实现客户端和服务器间的通信
通过上述示例,展示了如何使用Python的Socket模块实现基本的客户端和服务器间的通信。Socket提供了一种简单且强大的方式来建立和管理网络连接,适用于各种网络编程应用。理解和掌握Socket编程,可以帮助开发者构建高效、稳定的网络应用程序。
659 10
|
自然语言处理 搜索推荐 安全
国产CRM系统推荐:助力企业数字化转型
随着企业数字化转型加速,国产CRM系统凭借高性价比、本地化服务和灵活定制能力,成为众多企业的首选。本文对比推荐了几款主要的国产CRM系统,包括销售易、神州云动、八骏科技、纷享销客、悟空CRM等,分析其功能优势、服务支持及适用场景。销售易适合中大型企业,提供全面解决方案;神州云动强调全流程支持和客户数据管理;八骏科技注重全方位客户管理和数据分析;纷享销客则适合中小型企业,强调移动办公和社交化营销;悟空CRM以轻量化设计和简单操作赢得中小企业青睐。选择指南建议企业根据规模、预算、行业特点及系统集成需求,选择最适合的CRM系统,助力业绩高质量增长。
|
XML 监控 前端开发
Spring Boot中的WebFlux编程模型
Spring WebFlux 是 Spring Framework 5 引入的响应式编程模型,基于 Reactor 框架,支持非阻塞异步编程,适用于高并发和 I/O 密集型应用。本文介绍 WebFlux 的原理、优势及在 Spring Boot 中的应用,包括添加依赖、编写响应式控制器和服务层实现。WebFlux 提供高性能、快速响应和资源节省等优点,适合现代 Web 应用开发。
1625 15
|
测试技术 开发工具 git
利用Git Hooks自动化你的开发流程
【10月更文挑战第6天】在现代软件开发中,版本控制至关重要,Git作为主流工具,提供了强大的代码管理功能。Git Hooks 是 Git 的一个特性,可在特定事件(如提交、推送)发生时自动执行脚本,实现开发流程自动化。本文介绍 Git Hooks 的基本概念、常见用例及设置方法,涵盖 pre-commit、pre-push 等多种类型的 Hooks,并展示了如何利用它们进行代码格式化、自动化测试和风格检查,提升开发效率与代码质量。通过合理应用 Git Hooks,可以显著减少人为错误,确保代码一致性,并促进团队协作。
|
自然语言处理 JavaScript 开发者
通义灵码插件:VSCode 的智能编程助手
通义灵码插件:VSCode 的智能编程助手
14586 5
|
负载均衡 应用服务中间件 Linux
在Linux中,Nginx如何实现负载均衡分发策略?
在Linux中,Nginx如何实现负载均衡分发策略?

热门文章

最新文章

下一篇
开通oss服务