cmake配置

第一个CMake项目(单个源文件项目)

  1. linux安装CMake

  2. 创建Demo01文件夹

  3. 文件夹下创建main.cpp

  4. 创建CMakeLists.txt文件

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 3.13)
    # 项目信息
    project (Demo1)
    # 指定生成目标
    add_executable(Demo main.cpp)
  5. 在当前目录下执行cmake .命令生成makefile

    如果出现错误:

    No CMAKE_CXX_COMPILER could be found.

    可以通过下面命令修改

    sudo apt-get update
        sudo apt-get install -y build-essential
  6. 执行make命令生成可执行文件

  7. 运行可执行脚本即可

  8. cmake_处理报警信息

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-write-strings")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-return-type")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-sign-compare")

多个源文件项目

1.多个源文件在同一个目录下面

唯一需要修改的就是CMakeList.txt

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 指定生成目标
add_executable(Demo main.cpp utils.cpp)

由于源文件可能很多

# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (Demo2)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
# 指定生成目标
add_executable(Demo ${DIR_SRCS})

##2.多个源文件在不同的目录下面

├── main.cpp
└── utils
    ├── utils.cpp
    └── utils.h
  1. 第一种方式:

    # CMake 最低版本号要求
    cmake_minimum_required (VERSION 2.8)
    # 项目信息
    project (Demo2)
    # 指定生成目标
    add_executable(Demo main.cpp utils/utils.cpp)
  2. 多个CMakeLists.txt文件

    1. utils目录下的CMakeLists.txt

      # 查找当前目录下的所有源文件
      # 并将名称保存到 DIR_LIB_SRCS 变量
      aux_source_directory(. DIR_LIB_SRCS)
      # 生成链接库
      add_library (utils ${DIR_LIB_SRCS})
    2. main.cpp目录下的CMakeLists.txt文件

      # CMake 最低版本号要求
      cmake_minimum_required (VERSION 2.8)
      # 项目信息
      project (Demo4)
      # 查找当前目录下的所有源文件
      # 并将名称保存到 DIR_SRCS 变量
      aux_source_directory(. DIR_SRCS)
      # 添加 utils 子目录
      add_subdirectory(utils)
      # 指定生成目标 
      add_executable(Demo main.cpp)
      # 添加链接库
      target_link_libraries(Demo utils)

cmake编译安装

cmake ..
make
make install

配置文件

# 设置安装的文件夹
set(CMAKE_INSTALL_PREFIX /tmp/hello)
add_executable(main main.cpp)
# 安装命令
install(TARGETS main RUNTIME DESTINATION bin)

#同时生成两个库(.so动态库和.a静态库)

# 生成可执行程序
add_library(util SHARED utils.cpp utils.h)
set_target_properties(util PROPERTIES OUTPUT_NAME "util")

安装链接库

# 生成链接库
add_library(util SHARED utils.cpp utils.h)
set_target_properties(util PROPERTIES OUTPUT_NAME "util")
​
# 设置链接库的版本信息
set_target_properties(util PROPERTIES VERSION 0.1 SOVERSION 0)
# 安装链接库和头文件
install(TARGETS util LIBRARY DESTINATION lib)
install(FILES utils.h DESTINATION include/util)

使用链接库

  1. 在工程下创建cmake文件夹

  2. cmake下创建FindUtil.cmake

     # 设置根路径
     set(util_root /tmp/hello)
     # 设置头文件路径
     find_path(util_INCLUDE_DIRS utils.h ${util_root}/include/util)
     # 设置查找仓库路径
     find_library(util_LIBRARYS NAMES util HINTS ${util_root}/lib)
  3. CMakeLists.txt中定义如下

     cmake_minimum_required(VERSION 3.14)
     project(UseCmake)
    ​
     set(CMAKE_CXX_STANDARD 14)
    ​
     # 设置cmake的配置文件路径
     set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
     # 查找库(和FindUtil.cmake名字相关)
     find_package(Util)
     # 设置头文件路径
     include_directories(${util_INCLUDE_DIRS})
     # 生成可执行程序
     add_executable(UseCmake main.cpp)
    ​
     # 链接库
     target_link_libraries(
             UseCmake
             ${util_LIBRARYS}
     )

关于使用三方库

以奥博驱动举例

第一种使用方案

FindAuBo.cmake中:

# 设置头文件的路径
set(AuBo_INCLUDE_DIRS
        ${AuBo_DIR}/libconfig/linux_x64/inc;
        ${AuBo_DIR}/log4cplus/linux_x64/inc;
        ${AuBo_DIR}/protobuf/linux_x64/google/protobuf/inc;
        ${AuBo_DIR}/robotController/Header;
        ${AuBo_DIR}/robotSDK/inc)
​
# 库的名称
SET(AuBo_LIB_COMPONENTS config;log4cplus;protobuf;protobuf-
​
FOREACH(aubo_component ${AuBo_LIB_COMPONENTS})
    # 查找库
    find_library(lib_${aubo_component} NAMES ${aubo_component} PATHS
        ${AuBo_DIR}/protobuf/linux-x64/lib
        ${AuBo_DIR}/libconfig/linux_x64/lib
        ${AuBo_DIR}/log4cplus/linux_x64/lib
        ${AuBo_DIR}/robotController/linux_x64
        ${AuBo_DIR}/robotSDK/lib/linux_x64
        NO_DEFAULT_PATH)
    # 所有的库都保存在AuBo_LIBRARIES中(也不需要)
    # set(AuBo_LIBRARIES ${AuBo_LIBRARIES};${lib_${aubo_component}})
ENDFOREACH()

CmakeLists.txt中使用

include_directories(${AuBo_INCLUDE_DIRS})
​
target_link_libraries(
        main
        # ${AuBo_LIBRARIES}
        ${AuBo_LIB_COMPONENTS}
)

第二种方案

FindAuBo.cmake中:

# 头文件的文件夹
set(AuBo_INCLUDE_DIRS
        ${AuBo_DIR}/libconfig/linux_x64/inc;
        ${AuBo_DIR}/log4cplus/linux_x64/inc;
        ${AuBo_DIR}/protobuf/linux_x64/google/protobuf/inc;
        ${AuBo_DIR}/robotController/Header;
        ${AuBo_DIR}/robotSDK/inc)
# 链接库的文件夹
set(AuBo_LINK_DIRS
        ${AuBo_DIR}/protobuf/linux-x64/lib
        ${AuBo_DIR}/libconfig/linux_x64/lib
        ${AuBo_DIR}/log4cplus/linux_x64/lib
        ${AuBo_DIR}/robotController/linux_x64
        ${AuBo_DIR}/robotSDK/lib/linux_x64)

CmakeLists.txt文件中:

include_directories(${AuBo_INCLUDE_DIRS})
​
link_directories(${AuBo_LINK_DIRS})
​
target_link_libraries(
        main
#        ${AuBo_LIBRARIES}
        ${AuBo_LIB_COMPONENTS}
)

总结:

如果有find_library()就不需要link_directories()

find_package的工作机制

  1. 首先会在模块路径中寻找 Find<name>.cmake,这是查找库的一个典型方式。

    具体查找路径依次为: a. 变量${CMAKE_MODULE_PATH}中的所有目录

    b. 如果没有,然后再查看它自己的模块目录/share/cmake-xx/Modules/ (通过$CMAKE_ROOT输出)。这称为模块模式。

  2. 如果没有找到,会在~/.cmake/packages//usr/local/share/中的各个包目录中查找,

    寻找<库名字的大写>Config.cmake 或者 <库名字的小写>-config.cmake,称为配置模式

    比如Opencv:它会查找/usr/local/share/OpenCV中的OpenCVConfig.cmakeopencv-config.cmake

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值