CMake详解CMakeLists.txt

2023-05-16

目录

  • 1、CMake简介
  • 2、CMakeLists.txt文件
  • 3、一个简单的CMakeLists.txt入门示例
  • 4、示例:如何给动态库添加三方库依赖

【快速查询】https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands

返回目录

1、CMake简介

  CMake是跨平台编译工具,比make更高级一些。其编译的主要工作是生成CMakeLists.txt文件,然后根据该文件生成Makefile,最后调用make来生成可执行程序或者动态库。所以基本步骤就只有两步:(1)cmake生成CMakeLists.txt文件;(2)make执行编译工作。

  下面一张图对比一下AutoTools与CMake的工作流程(可见CMake比较清晰简洁):

 

返回目录

2、CMakeLists.txt文件

详情参考:http://wiki.ros.org/catkin/CMakeLists.txt


1、Required CMake Version (cmake_minimum_required)
2、Package Name (project())
3、Find other CMake/Catkin packages needed for build (find_package())
4、Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files())
5、Invoke message/service/action generation (generate_messages())
6、Specify package build info export (catkin_package())
7、Libraries/Executables to build (add_library()/add_executable()/target_link_libraries())
8、Tests to build (catkin_add_gtest())
9、Install rules (install())  

(1)CMake Version: 
每一个 catkin CMakeLists.txt 必须以 CMake 需要的版本开始,Catkin 需要版本 2.8.3 或者更高


cmake_minimum_required(VERSION 2.8.3)  

(2)Package name: 
CMake project function 指定的文件名。


project(robot_brain)  

在 CMake script 文件中,引用 CMake package 可以使用变量 ${PROJECT_NAME}

(3)依赖功能包:

寻找需要用到的其他 CMake packages,用函数 find_package。 
至少依赖一个关于 catkin 的功能包


find_package(catkin REQUIRED)  

如果要使用 C++ 和 Boost,则需要引用 find_package 包含 Boost,并且指明 Boost 的类型,如使用 Boost threads,则:


find_package(Boost REQUIRED COMPONENTS thread)  

 (4)catkin_package() 

catkin_package() 是 catkin 支持的 CMake 宏指令。用来向编译系统指明 catkin-specific 的信息,而编译系统来生成 pkg-config and CMake files。

该函数必须用在用 add_library() or add_executable() 声明之前。 
有5个可选参数:


INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package
LIBRARIES - The exported libraries from the project
CATKIN_DEPENDS - Other catkin projects that this project depends on
DEPENDS - Non-catkin CMake projects that this project depends on
CFG_EXTRAS - Additional configuration options  

 例如:


catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)  

 (5)Specifying Build Targets

返回目录

3、一个简单的CMakeLists.txt入门示例

  外部编译:单独建立一个空目录专门用于cmake编译,便于管理编译中间文件。在空目录中用 cmake ../(CMakeLists.txt所在目录)就行了,中间文件生成在当前目录。

  工程结构:


.
├── build
├── CMakeLists.txt
├── include
│   └── math_lib.h
└── src
    ├── main.cpp
    └── math_lib.cpp
  

3 directories, 4 files

  CMakeLists.txt示例(借鉴网友配置):


# 1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.4.1)
  

# 2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(test_math_lib)

# 3.head file path,头文件目录
INCLUDE_DIRECTORIES(include)

# 4.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

# 5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(TEST_MATH ${DIR_SRCS})

# 6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})

# 7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

   编译方法(直接生成目标程序):


kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake$ cd build/
kuliuheng@ubuntu:~/_8GB_EXT/workspace/cpp/testCmake/build$ cmake ../
-- The C compiler identification is GNU 7.4.0
-- The CXX compiler identification is GNU 7.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kuliuheng/_8GB_EXT/workspace/cpp/testCmake/build  
返回目录

4、示例:如何给动态库添加三方库依赖

方法一:用LINK_DIRECTORIES 来指定三方库路径,然后通过库名称去链接。需要注意一个坑就是LINK_DIRECTORIES 要放到 ADD_LIBRARY 前面才行。


file(GLOB_RECURSE header1_files "src/main/cpp/3rd/*.h")
file(GLOB_RECURSE source1_files "src/main/cpp/3rd/*.cpp")
  

LINK_DIRECTORIES(“libs/${ANDROID_ABI}”) # 添加三方库的绝对/相对路径,用于搜索三方库。但是千万要注意一点:要放到ADD_LIBRARY之前,否则不生效!

ADD_LIBRARY (
my_lib  # 设置生成动态库的名称
SHARED  # 设置库类型,STATIC 或 SHARED

         <span style="color: rgba(0, 128, 0, 1)"># 需要编译的c</span></span><span style="color: rgba(0, 128, 0, 1)">/c++</span><span style="color: rgba(0, 0, 0, 1)"><span style="color: rgba(0, 128, 0, 1)"> 文件</span>
         ${source1_files}
         src</span>/main/<span style="color: rgba(0, 0, 255, 1)">cpp</span>/jni_main.<span style="color: rgba(0, 0, 255, 1)">cpp</span><span style="color: rgba(0, 0, 0, 1)">
         )

target_link_libraries(
my_lib  # 链接目标

                   # Links the target library to the log library included in the NDK</span><span style="color: rgba(0, 0, 0, 1)">
                   ${log</span>-<span style="color: rgba(0, 0, 0, 1)">lib}

            plug_ins_project        <span style="color: rgba(0, 128, 0, 1)"># 这个就是对应libplug_ins_project.so库文件</span>
    )    </span></pre>

 方法二:通过ADD_LIBRARY 结合 SET_TARGET_PROPERTIER 来指定第三方库绝对路径信息,然后连接库名即可。

TIPS:可以用MESSAGE打印调试日志—— MESSAGE(WARNING "${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}")


# 通过add_library 可以引入三方库,通过set_target_properties 指定具体三方库的属性
add_library(plug_ins
        SHARED
        IMPORTED)
set_target_properties( plug_ins
        PROPERTIES IMPORTED_LOCATION
        ${PROJECT_SOURCE_DIR}/libs/${ANDROID_ABI}/libplug_ins_project.so)
  

target_link_libraries( # Specifies the target library.
# 指定链接的目标库
my_lib

                   # Links the target library to the log library
                   # included </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> the NDK.
                   ${log</span>-<span style="color: rgba(0, 0, 0, 1)">lib}
    plug_ins
    )</span></pre>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake详解CMakeLists.txt 的相关文章

随机推荐

  • kali-linux基础命令

    文件与目录操作命令 touch 命令用于创建空白文件与修改文件时间 xff0c 格式为 xff1a touch 选项 文件 cp 命令用于复制文件或目录 xff0c 格式为 xff1a cp 选项 源文件 目标文件 mv 命令用于移动文件或
  • 我,程序员,想做人工智能,可现实劝我回头是岸!

    最近不少准备入行人工智能的粉丝向我吐槽 xff1a 1 人工智能怎么入行 xff1f 应用方向那么多 xff0c 哪个才是最适合自己的 xff1f 2 看了不少人工智能课程 xff0c 但门槛都太高了 xff0c 真正零基础的课程少之又少
  • 如何将Pyecharts绘制的 "地图" 展示在百度地图中?

    人生苦短 xff0c 快学Python xff01 Pyecharts绘图的确很棒 xff0c 尤其是地图 xff0c 那么将你的数据指标 xff0c 展示在百度地图中 xff0c 有时怎么样的一种感觉 xff1f 其实Pyecharts绘
  • 爬虫到底违法吗?这位爬虫工程师给出了答案

    作者 猪哥 来源 裸睡的猪 xff08 ID xff1a IT Pig xff09 一 自述 1 关于大学 我读的大学是个野鸡学校 xff0c 虽说是一个计算机专业 xff0c 但实际的课程内容很杂 CAD 3DMAX Office全家桶之
  • 开发者,你真正关心的问题是什么?| AI ProCon 2019

    2018 年 xff0c 上千名开发者与上百名技术专家齐聚一堂 xff0c 在 CSDN 2018 AI开发者大会上以 AI技术与应用 为核心 xff0c 深度聚焦人工智能的技术创新与行业应用 xff0c 真正做到了 只讲技术 xff0c
  • JETSON XAVIER NX入门教程(一)基础设置和安装

    1 Intro jetson xxx系列 作为nvidia公司的AIOT产品 作用非常强大 生态也是很活跃 确实是可以入门的极好产品 此处省去几万字 2 Basic install 2 1镜像烧录 就是下载不对型号设备的镜像 官网链接 然后
  • Nvidia Jetson nano 插卡插hdmi和电源无法开机显示器黑屏jetsonnano重置系统恢复

    Ensure smooth network 确保网络畅通 下载包 进下载页面下载对应NVIDIA SDK Manager NVIDIA Developer Upload deb to ubuntu vm 上传包 Install deb 安装
  • 激光雷达目标检测 (上)

    激光雷达目标检测 xff08 上 xff09 转载自美团无人专送团队 简介 安全性是自动驾驶中人们最关注的问题之一 在算法层面 xff0c 无人车对周围环境的准确感知是保证安全的基础 xff0c 因此感知算法的精度十分重要 现有感知算法的思
  • apt更换镜像源

    文章转载至 荒野雄兵的博客 https blog csdn net daerzei article details 84873964 系统说明 xff1a VMware14 Pro下Ubuntu18 04 LTS版 xff0c 64位 网上
  • 绝不拖延(转)

    我要立即行动 绝不拖延 从今天起 无论做什么事情 我要立即行动 绝不拖延 拖延是造成人世一切悲剧根源 xff0c 我要竭力避免拖延 如同逃避罪恶的引诱 曾经 我有多少美好的憧憬 我多少远大的理想 我多少切实的计划 因为拖延 而被冲刷得一干二
  • mt7601u linux驱动编译,移植MT7601U AP Linux 驱动至Orangepi-PC2开发板

    简单一下记录移植MT7601U AP Linux 驱动至Orangepi PC2开发板的过程 二 环境描述 1 Orangpi PC2开发板 Linux Orangepi 3 10 65 12 SMP PREEMPT Sat Mar 4 1
  • 黑群晖docker清理缓存_Docker容器日志查看与清理(亲测有效)

    1 问题 docker容器日志导致主机磁盘空间满了 docker logs f container name噼里啪啦一大堆 xff0c 很占用空间 xff0c 不用的日志可以清理掉了 2 解决方法 2 1 找出Docker容器日志 在lin
  • 配置华为s系列交换机mode lacp

    以S5700为例 xff1a 1 创建eth trunk 1 xff0c 并配置成LACP模式 lt Quiway gt system view Quiway sysname SwitchA SwitchA interface Eth Tr
  • 使用 KubeSphere 快速部署 Chaos Mesh

    Chaos Mesh 简介 Chaos Mesh 是一个开源的云原生混沌工程平台 xff0c 提供丰富的故障模拟类型 xff0c 具有强大的故障场景编排能力 xff0c 方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常 x
  • phpstorm 2018破解版 2018.2下载安装和JetbrainsCrack.jar激活教程

    一 下载phpstrom破解版http www sdbeta com wg 2018 0330 221278 html 二 双击PhpStorm 2018 1 exe运行 xff0c 开始安装 xff0c 进入安装向导 xff0c 点击ne
  • 操作mysql_MySQL:MySQL的基本操作

    那么如果我只想要数据 xff0c 而不想要什么sql命令时 xff0c 应该如何操作呢 xff1f 可将查询存储在一个文件中并告诉mysql从文件中读取查询而不是等待键盘输入 可利用外壳程序键入重定向实用程序来完成这项工作 例如 xff0c
  • winscp 配置(详细)

    winscp 配置 xff08 详细 xff09 问题起因 想在A电脑上直接访问到B电脑的文件 xff0c 不用中间拷来拷去的 xff0c 太麻烦 所以就下载了winscp这个软件 但是在使用时出现了一些问题 xff0c 好在最终都解决了
  • 【电脑配置】二、Windows10+Ubuntu16.04双系统安装

    电脑配置之双系统安装 目录 电脑配置之双系统安装前言一 Windows10安装二 Ubuntu16 04安装1 进入BIOS模式2 分区 三 出现的问题和解决办法1 Ubuntu下引导Windows启动卡死2 Windows时间提前八小时3
  • 逆向研究QCA9563固件,查看和修改GPIO定义

    自己刷了个qca9563用作ap玩 xff0c 奈何GPIO定义不清楚 xff0c wan口灯什么的都不知道引脚定义 某快的GPIO定义网上只有寥寥言语 xff0c 在某鱼商家眼里 xff0c 这些都是能卖钱的机密信息 于是想既然有固件了
  • CMake详解CMakeLists.txt

    目录 1 CMake简介2 CMakeLists txt文件3 一个简单的CMakeLists txt入门示例4 示例 xff1a 如何给动态库添加三方库依赖 快速查询 https cmake org cmake help v2 8 8 c