首页 > 其他分享 >cmake基本用法教程

cmake基本用法教程

时间:2024-03-04 21:55:58浏览次数:18  
标签:可执行文件 教程 include cmake mymath 用法 cpp main

cmake tutorial examples

Three examples.

  1. basic cpp compile process.
  2. add static or shared library by cmake.
  3. using third party library.

本项目提供三个cmake的例子,以供日常使用。

  1. 使用cmake编译含有头文件和多个cpp文件的项目,生成可执行文件。
  2. 使用cmake编译含生成静态或动态链接库,并引用库文件生成可执行文件。
  3. 使用cmake编译调用第三方库的cpp项目,生成可执行文件。

第一个项目

使用cmake编译基本的cpp文件,包含多个cpp文件和头文件,没有依赖第三方的库,仅使用了c++标准库。

项目结构如下:

src下两个文件,main.cpp调用了mymath.cpp文件。

cmakelists.txt文件编写编译规则:

# 声明camke最低版本
cmake_minimum_required(VERSION 3.5)
# 项目名称以及版本号
project(basic_cmake VERSION 1.0)

# 添加源文件到变量CPP_LIST
aux_source_directory(./src CPP_LIST)
# 生成可执行文件,把可执行文件以来的所有源文件都要添加上
add_executable(main ${CPP_LIST})
# 添加可执行文件的头文件搜索路径
target_include_directories(main PUBLIC ${PROJECT_SOURCE_DIR}/include)

编译方法如下

mkdir build
cd build
cmake ..
make
# 运行二进制文件
./main

第二个项目

使用cmake编译生成库文件,并调用库文件生成可执行文件

首先,介绍静态库。静态库区别于动态库,静态库就是在链接(我们把cpp的编译过程分为4个阶段:预处理、编译、汇编、链接,这里的链接指的第四个阶段)时会将目标文件(.o文件)全部打包进二进制文件;动态库就是在链接时不把目标文件打包进二进制文件,而是等到运行时才动态加载。

然后,介绍项目结构。由于在cmake中静态库和动态库的生成命令基本一致,这里仅介绍动态库,静态库看仓库代码即可。我们需要把mymath.cpp编译成动态库,main.cpp调用库函数,生成可执行文件。

cmakelist.txt

cmake_minimum_required(VERSION 3.5)
project(dynamic_lib VERSION 1.0)

# 添加动态库,不写SHARED默认是动态库
add_library(mymath_dynamic SHARED ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
# 设置动态库的include文件夹
target_include_directories(mymath_dynamic PUBLIC ${PROJECT_SOURCE_DIR}/include)
# 这里的PUBLIC表示对三方的依赖是否传递
# target_link_libraries(main PUBLIC other_lib)

# complie exe
add_executable(main ./src/main.cpp)
# 可执行文件链接动态库
target_link_libraries(main PRIVATE mymath_dynamic)

第三个项目

调用第三方库gtest,然后使用cmake编译。

项目结构:

main.cpp中调用mymath.cpp文件和gtest第三方库,然后使用cmake编译,这里gtest已经提前通过安装好了,安装过程过程自行搜索。

cmakelists.txt

cmake_minimum_required(VERSION 3.5)
project(std_cmake_project VERSION 1.0)

find_package(GTest REQUIRED)
message("GTEST_LIBRARIES: ${GTEST_LIBRARIES}")
message("GTEST_INCLUDE_DIRS: ${GTEST_INCLUDE_DIRS}")

# 添加动态库
add_library(mymath_dynamic SHARED ${PROJECT_SOURCE_DIR}/src/mymath.cpp)
# 设置动态库的include文件夹
target_include_directories(mymath_dynamic PUBLIC ${PROJECT_SOURCE_DIR}/include)

# 添加测试可执行文件
add_executable(main ./src/main.cpp)
# 添加可执行文件的依赖库和依赖头文件
target_include_directories(main PUBLIC ${GTEST_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/include)
target_link_libraries(main ${GTEST_LIBRARIES} mymath_dynamic pthread) # 注意要链接pthread库,是个bug

完整项目

完整项目请参看github仓库

标签:可执行文件,教程,include,cmake,mymath,用法,cpp,main
From: https://www.cnblogs.com/LadissonLai/p/18052818

相关文章

  • 高级口译教程第5版pdf电子版,12341243
         1231123131231231第1篇:高级口译教程第四版UniteOne外事接待口译课文01浏览:2511第2篇:高级口译教程第四版UniteOne外事接待口译课文02浏览:1559第3篇:高级口译教程第四版UniteOne外事接待课外练习01浏览:1327第4篇:高级口译教程第四版Unite......
  • C# new 关键字用法
    试题回答参考思路:一,用法总结:在c#中,new关键字可用作运算符,声明修饰符,约束。1)new运算符:new运算符创建类型的新实例,调用构造函数(如果继承了基类,同时会调用基类的构造函数)。2)new声明修饰符:2.1)在用作声明修饰符时,new关键字可以显式隐藏从基类继承的成员。派生类成员变量被new关键字......
  • ROS action教程
    action教程rosaction是topic和service的结合升级版,专门针对某些特殊使用场景,执行时间、执行过程需要连续反馈,比如ros系统给机器人下达目标点,机器人运动到目标点需要一段时间,并且ros系统需要机器人连续的运动反馈,这是控制过程常见的场景。工作结构图如下。ROS官方已经为我们......
  • ROS 动态参数服务器教程
    ROS动态参数服务器ros动态参数在官方叫做dynamic_reconfigure,这个功能的作用是用于node运行时修改内部参数,区别于静态读取本地yaml文件参数的方式(更常用),请见另一github仓库。主要用途是在调试机器人时能动态修改机器人参数,而不需要重新编译。具体操作流程:1、创建一个cfg文件(p......
  • C++ 简易STL 教程 与 C++ 标准库
    C++STL(标准模板库)是一套功能强大的C++模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。C++标准模板库的核心包括以下三个组件:组件描述容器(Containers)容器是用来管理某一类对象的集合。C++提供了各种不......
  • ROS 加载yaml教程
    ros加载yaml文件ROS官方提供了自动加载yaml文件的功能,并且集成到了launch文件里面,只需要使用rosparam标签就能把yaml配置文件加载到ros的参数服务器里面,然后使用nodehandle.getParam()函数就可以方便的使用了。下面给出关键的使用步骤:编写yaml文件。注:避免使用-分割数组,否则......
  • ROS pluginlib使用教程
    pluginlib用法通俗一点说,plugin的用法就像是面向对象编程里面的多态。插件就是子类,插件实现父类的方法,那么系统调用父类方法时就是子类的方法,也就实现了替换。对应ROS里面只需要在launch文件中选择想要的插件,无需修改预案系统即可完成替换。这里实现一个常用的plugin场景。core......
  • coalesce函数用法sql
    原文链接:https://baijiahao.baidu.com/s?id=1725625533668535989&wfr=spider&for=pccoalesce语法:COALESCE(value1,value2,...);举个例子:返回表达式中第一个非空表达式,以下语句:SELECTCOALESCE(NULL,NULL,3,4,5)FROMdual其返回结果为:3 MySQLCOALESCE与IFNULL......
  • codeblocks两种创建文件的方式(含调试教程)
    codeblock用法以及调试教程codeblock两种创建文件的方式:1.直接建一个空白文件这种方式创建新文件的缺点是不能调试,debug是灰色的不能点第二种创建文件的方式:新建一个项目project创建一个空项目同样新建一个空白文件,只不过这种方法会提示你是否要把这个文件放在项目里先......
  • docker系列教程04---容器网络
    一、Docker不启动时默认的网络情况这里先把Docker停掉了,然后咱们ifconfig看一眼:ifconfig ens33不用多说了,lo为回环。这里可能还会有一个virbr0,在CentOS7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个以网桥连接的私网地址的virbr0网卡(virbr......