cmake基本用法

基本用法

# 声明最低版本类型
cmake_minimum_required( VERSION 2.8)
# 创建一个工程,工程名为hello
project( hello )
# 设置编译模式
# 编译模式有”DEBUG" 和 "RELEASE"
# “DEBUG”为调试模式,可进行断点测试
# "RELEASE"为发行模式,速度更快
set(CMAKE_BUILD_TYPE "DEBUG")

# 增加可执行文件
ADD_EXECUTABLE(hello hello.cpp)
# 增加静态库,以“.a”作为后缀,每次调用都会生成一个副本
ADD_LIBRARY(hello libHello.cpp)
# 增加共享库,以".so"为后缀,只有一个副本
ADD_LIBRARY(hello_shared SHARED libHello.cpp)

ADD_EXECUTABLE(useHello useHello.cpp)
# 使用库前要链接,并在源文件中用头文件引用
TARGET_LINK_LIBRARIES(useHello hello_shared)
# 添加外部头文件
include_directories("dir_path")

常用指令

  • PROJECT(prejcetname): 创建工程
  • SET(varname src1.cpp src2.cpp):设置变量
  • MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR “message to display”)

常用变量

  • PROJECT_BINARY_DIR: 指代编译路径
  • PROJECT_SOURCE_DIR: 指代工程的路径
  • EXECUTABLE_OUTPUT_PATH: 指代可执行文件的保存位置
  • LIBRARY_OUTPUT_PATH: 指代库文件的保存位置
  • CMAKE_BUILD_TYPE: 指代编译类型,有"DEBUG"和"RELEASE"

基本语法规则

  • 指令大小写无关,但变量和参数对大小写敏感
  • 变量用${}取值,IF控制语句直接使用变量名

外部构建(out-of-source build)

  • 定义:与内部构建对应(in-source build),即在指定路径
    进行编译,对原工程几乎没有影响
  • 用途:直接编译会在工程目录中产生很多中间文件,使用外部构建的方法可以避免这一问题
  • 具体做法:
    使用cmake filepath 指定工程路径进行编译, 可在工程目录里新建“build”文件夹,让代码在该文件夹中编译,所有中间文件都会保存在“build”文件夹中
mkdir ./build && cd ./build
cmake ..
make

多层目录结构

  1. 在工程目录中的CMakeLists.txt中间中,用ADD_SUBDIRECTORY()指令来添加含源文件的目录
  2. 在需要编译的子目录中的CMakeLists.txt中添加编译可执行文件

指定二进制文件的保存位置

  1. ADD_SUBDIRECTORY(src bin): 第二个参数为src 目录编译后产生文件的保存位置,此例保存在${PROJECT_BINARY_DIR}/bin中
  2. SET(EXECUTABLE_OUTPUT_PATH ${VAR})
    或者SET(LIBRARY_OUTPUT_PATH ${VAR)

静态库和动态库

  • 如何构建动态库和静态库
    静态库:ADD_LIBRARY(hello libhello.cpp)
    动态库:ADD_LIBRARY(hello_shared SHARED libhello.cpp)
  • 静态库和动态库不能同名;若要同名,可添加 SET_TARGET_PROPERTIES(libname PROPERTIES OUTPUT_NAME “str”)指令
  • 控制动态库版本

使用外部库

  1. find_package(Pangolin REQUIRED)# 找到头文件和库文件地址
  2. include_directories(${Pangolin_INCLUDE_DIRS})#引用头文件
  3. target_link_libraries(exename ${Pangolin_LIBRARIES})#链接库文件(如果需要的话)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值