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


相关文章
|
3月前
|
缓存 Unix 程序员
CMake 教程1
CMake 教程
66 1
|
3月前
CMake 教程2
CMake 教程
24 0
|
5月前
|
C++ 存储 索引
面向 C++ 的现代 CMake 教程(一)(5)
面向 C++ 的现代 CMake 教程(一)
98 0
|
5月前
|
C++ Unix Windows
面向 C++ 的现代 CMake 教程(四)(3)
面向 C++ 的现代 CMake 教程(四)
50 0
|
5月前
|
C++ 缓存 Unix
面向 C++ 的现代 CMake 教程(四)(4)
面向 C++ 的现代 CMake 教程(四)
49 0
|
5月前
|
C++ 开发者 开发工具
面向 C++ 的现代 CMake 教程(四)(2)
面向 C++ 的现代 CMake 教程(四)
66 0
|
5月前
|
C++ 开发者 缓存
面向 C++ 的现代 CMake 教程(四)(1)
面向 C++ 的现代 CMake 教程(四)
63 0
|
5月前
|
C++ 开发者 Unix
面向 C++ 的现代 CMake 教程(四)(5)
面向 C++ 的现代 CMake 教程(四)
54 0
|
5月前
|
C++ 存储 测试技术
面向 C++ 的现代 CMake 教程(五)(2)
面向 C++ 的现代 CMake 教程(五)
69 0
|
5月前
|
C++ 缓存 存储
面向 C++ 的现代 CMake 教程(一)(3)
面向 C++ 的现代 CMake 教程(一)
134 0