cmake添加一个库的实现步骤

 更新时间:2023年06月12日 14:45:52   作者:波雅_汉库克  
本文主要介绍了cmake添加一个库的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

项目格式

Step2

  • mathFunctions/CMakeLists.txt mysqrt.cxx MathFunctions.h
  • CMakeList.txt
  • tutorial.cxx
  • Tutorial.h.in

cmake基本语法

设置编译器

set (CMAKE_C_COMPILER "D:/Program Files/LLVM/bin/gcc")
set (CMAKE_CXX_COMPILER "D:/Program Files/LLVM/bin/g++")

CMAKE_C_COMPILER C语言编译器,CMAKE_CXX_COMPILER C++编译器。

添加库

add_subdirectory(MathFunctions)

添加的MathFunctions就是文件夹的名字也可以理解为库的名字

链接库

target_link_libraries(Tutorial PUBLIC MathFunctions)

第一个参数是生成的可执行文件,中间的是公有的,第三个参数是库的名字.

添加库的头文件

target_include_directories(Tutorial PUBLIC ${PROJECT_SOURCE_DIR}/MathFunctions ${PROJECT_BINARY_DIR})

第一个参数是生成的可执行文件,中间的是公有的,第三个参数是库的路径,应该说后面的参数都是路径.

其中:

${PROJECT_SOURCE_DIR} 这个变量是主Cmake文件的变量

${PROJECT_BINARY_DIR}这个变量是cmake -B生成的路径的变量

cmake打印字符串

message("hello world")
message(${PROJECT_SOURCE_DIR}/MathFunctions)

这个就是打印出来的字符串.

库的cmake文件

这个cmake文件不需要写那么多公共命令. 

cmake生辰库

add_library(MathFunctions mysqrt.cxx)

这行代码就是把cxx文件添加到库中

mian函数中使用

添加头文件

#include <MathFunctions.h>

可以直接使用尖括号,因为cmake已经把头文件添加到可执行文件中了.

然后直接调用函数即可.

让库成为可选的

cmake基本语法

设置option变量

option(USE_MYMATH "Use tutorial provided math implementation" ON)

设置一个USE_MATH的变量,第二个参数是说明字符串,第三个是启动或者关闭 ON是启动,OFF是关闭.

注意:option这个设置变量一定要在configure_file(TutorialConfig.h.in TutorialConfig.h)这行前面才可以,要不然option设置的不起作用.

cmake设置条件链接库

if (USE_MYMATH)
    add_subdirectory(MathFunctions)
    list(APPEND EXTRA_LIBS MathFunctions)
    list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR})
endif()

意思是如果USE_MYMATH为ON才可以链接自己的库

其中强调两行代码就是list的代码

  • list(APPEND EXTRA_LIBS MathFunctions)
  • list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR})

这两行代码你可以理解为依赖的库声明成一个变量列表,例如EXTRA_LIBS这个变量就是存储的MathFunctions这个库这里只有一个demo如果要链接十个八个只要在list后面空格添加就行,

EXTRA_INCLUDES这个也是同理,目的也是为了下面添加链接库和添加头文件的时候简单一点.

链接库

target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})

这里就用到EXTRA_LIBS 这个列表

添加头文件

target_include_directories(Tutorial PUBLIC 
                            ${EXTRA_INCLUDES}
                            ${PROJECT_BINARY_DIR})

这里就用到EXTRA_INCLUDES这个列表

修改cmake配置文件

#cmakedefine USE_MYMATH

添加一行这个代码

USE_MYMATH这个变量就是对应一开始的option设置的变量

如果option设置USE_MYMATH为ON, cmake配置文件生成的头文件就会定义USE_MYMATH

这个不是自己写的是cmake自己生成的. 

修改引用的源码

 

更新链接库的过程

如果每次主cmake文件每次链接一个库都要target_include_directories一个库名字就有点重复,所以可以修改cmake库来实现当链接这个库的时候就包含头文件了。

第一步就是修改库的cmake文件:

add_library(MathFunctions mysqrt.cxx)
target_include_directories(MathFunctions
    INTERFACE
    ${CMAKE_CURRENT_SOURCE_DIR})

第一行代码是添加库名字,第二行是添加库的头文件,第一个参数是库的名字,

INTERFACE:第二个参数意思是当链接这个库的时候就要包含include第三个参数的头文件,但是自己的库不使用头文件,

还有一个PUBLIC:

PUBLIC:这个的意思是不光链接这个库的需要使用库头文件,自己也是用。一般这个使用的比较多。

第三个参数就是头文件的路径,

${CMAE_CURRENT_SOURCE_DIR}

这个变量是什么意思了?这个意思是当前cmake文件的目录,这个变量和${PROJECT_SOURCE_DIR}这个变量比较相似,这个是指定项目当前的路径。

主cmake文件就可以把上面链接MathFunctions文件可以删除了。

到此这篇关于cmake添加一个库的实现步骤的文章就介绍到这了,更多相关cmake添加库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++验证LeetCode包围区域的DFS方法

    C++验证LeetCode包围区域的DFS方法

    这篇文章主要介绍了C++验证LeetCode包围区域的DFS方法,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++中的strcmp函数

    C++中的strcmp函数

    strcmp函数是C++标准库中用于字符串比较的重要函数,在C++中,字符串比较是一项常见的操作,用于判断两个字符串是否相等或者大小关系,本文介绍C++中的strcmp函数,感兴趣的朋友一起看看吧
    2024-03-03
  • 深入了解C语言指针

    深入了解C语言指针

    这篇文章主要介绍了C语言指针详解及用法示例,介绍了其相关概念,然后分享了几种用法,具有一定参考价值。需要的朋友可以了解下
    2021-07-07
  • C语言 图文并茂详解程序编译过程

    C语言 图文并茂详解程序编译过程

    C语言是一种编译型语言,需要把源文件进行编译之后才能运行,它的编译过程是:预处理:展开头文件、宏替换,去掉注释,条件编译;编译:检查语法,生成汇编;汇编:把生成的汇编文件汇编成机器码;链接:链接到一起生成可执行程序
    2022-04-04
  • 利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    利用C语言模拟实现qsort,strcpy,strcat,strcmp函数

    这篇文章主要为大家详细介绍了如何通过C语言模拟实现qsort(采用冒泡的方式),strcpy,strcat,strcmp等函数,文中的示例代码讲解详细,感兴趣的可以了解一下
    2022-11-11
  • Inline Hook(ring3)的简单C++实现方法

    Inline Hook(ring3)的简单C++实现方法

    这篇文章主要介绍了Inline Hook(ring3)的简单C++实现方法,需要的朋友可以参考下
    2014-08-08
  • Qt音视频开发之视频文件保存功能的实现

    Qt音视频开发之视频文件保存功能的实现

    和音频存储类似,视频的存储也对应三种格式,视频最原始的数据是yuv(音频对应pcm),视频压缩后的数据是h264(音频对应aac)。本文将利用Qt实现视频文件保存功能,感兴趣的可以了解一下
    2022-12-12
  • C++设计模式之命令模式

    C++设计模式之命令模式

    这篇文章主要介绍了C++设计模式之命令模式,本文讲解了什么是命令模式、命令模式的使用场合等内容,并给出了一个代码实例,需要的朋友可以参考下
    2014-10-10
  • C++实现寻找最低公共父节点的方法

    C++实现寻找最低公共父节点的方法

    这篇文章主要介绍了C++实现寻找最低公共父节点的方法,是数据结构中二叉树的一个经典算法,有一定的借鉴价值,需要的朋友可以参考下
    2014-09-09
  • C语言手把手教你实现贪吃蛇AI(中)

    C语言手把手教你实现贪吃蛇AI(中)

    这篇文章主要为大家详细介绍了C语言手把手教你实现贪吃蛇AI的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01

最新评论