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})


相关文章
|
设计模式 安全 Oracle
Java学习笔记:从入门到精通
Java学习笔记:从入门到精通
|
XML 存储 网络安全
ROS入门(二):launch文件解析
该文章是关于ROS入门的第二篇教程,详细解析了ROS中的launch文件,包括其运行方式、XML格式规范、标签使用、参数替代、条件属性以及通过简单和复杂案例来演示launch文件的使用,最后介绍了如何在参数服务器上设置参数。
ROS入门(二):launch文件解析
|
Linux Docker 容器
journalctl 命令使用总结
journalctl 命令使用总结
418 1
|
存储 Prometheus Cloud Native
[prometheus]基于influxdb2实现远端存储
[prometheus]基于influxdb2实现远端存储
462 2
|
负载均衡 应用服务中间件 Linux
在Linux中,Nginx如何实现负载均衡分发策略?
在Linux中,Nginx如何实现负载均衡分发策略?
|
存储 安全 Java
什么是 PasswordEncoder?
【8月更文挑战第21天】
305 0
|
存储 编译器 项目管理
深入探索 CMake:揭秘非常规特殊变量${ARGN},${ARGV},${ARGV0}, ${ARGV1}等等
深入探索 CMake:揭秘非常规特殊变量${ARGN},${ARGV},${ARGV0}, ${ARGV1}等等
243 2
|
安全 编译器 API
程序与技术分享:C#调用DLL的几种方法
程序与技术分享:C#调用DLL的几种方法
1019 0
|
运维 Linux Apache
Docker详解(十二)——Docker容器权限问题
Docker详解(十二)——Docker容器权限问题
3628 5
|
消息中间件 安全 Java
解析KafkaConsumer类的神奇之道
解析KafkaConsumer类的神奇之道
322 0