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


相关文章
|
4月前
|
Unix 编译器 C++
Cmake环境搭建
Cmake环境搭建
40 0
|
4月前
|
存储 编译器 C++
|
4月前
|
Kubernetes NoSQL Unix
cmake入门学习笔记
cmake入门学习笔记
|
4月前
|
编译器 Shell C语言
Makefile快速入门
Makefile快速入门
28 0
|
5月前
|
Java Linux 编译器
CMake从入门到弃坑
CMake 说明 cmake的定义是什么 ?-----高级编译配置工具 当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll,so等等)这时候神器就出现了-----CMake!
87 1
|
6月前
|
存储 Shell
CMake01快速上手
本文旨在快速上手并且使用cmake,更多深入内容请参考后续的blog。
CMake实战(一)
CMake和Autotools一样,都是项目构建工具。可以简单理解为,帮助我们生成Makefile,方便编译。
CMake实战(二)
上一篇《CMake实战(一)》我们是把所有文件放在同一个目录下,而平常开发时,我们会将源文件进行分类,放到不同的目录下。接下来我们来看一下具体要怎么操作。
CMake实战(三)
前面两篇《CMake实战(一)》,《CMake实战(二)》,主要是介绍单目录和多目录的编译,接下来看一下自定义编译选项和交叉编译。
CMake教程10:编写CMake中遇到的问题
CMake教程10:编写CMake中遇到的问题
952 0