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语言编程C++动态内存分配示例讲解

    C语言编程C++动态内存分配示例讲解

    这篇文章主要介绍了C语言编程C++动态内存分配示例讲解,为什么存在动态内存分配?本文通过动态内存介绍及常见内存错误等示例来为大家讲解
    2021-09-09
  • C++使用opencv读取图片的操作代码(图像处理)

    C++使用opencv读取图片的操作代码(图像处理)

    这篇文章主要介绍了C++使用opencv读取图片,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C语言中static与sizeof查缺补漏篇

    C语言中static与sizeof查缺补漏篇

    static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样;如果是修改局部变量,则每次调用的时候,保持着上一次的值;而sizeof是用来判断一个变量及数据类型所占字节数的,下面我们详细来看看
    2022-07-07
  • C语言动态顺序表实例代码

    C语言动态顺序表实例代码

    大家好,本篇文章主要讲的是C语言动态顺序表实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • C语言实现恶作剧关机程序

    C语言实现恶作剧关机程序

    大家好,本篇文章主要讲的是C语言实现恶作剧关机程序,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Qt使用Quazip解压缩、压缩文件的实现

    Qt使用Quazip解压缩、压缩文件的实现

    Quazip是在zlib基础上进行了简单封装的开源库,利用它可以很方便将单个或多个文件打包为zip文件,本文主要介绍了Qt使用Quazip解压缩、压缩文件的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • C++左值和右值学习笔记

    C++左值和右值学习笔记

    这篇文章主要为大家介绍了C++左值和右值学习笔记的重点讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • C语言结构体的具体使用方法

    C语言结构体的具体使用方法

    这篇文章主要介绍了C语言结构体的相关资料,需要的朋友可以参考下
    2021-08-08
  • C语言使用单链表实现学生信息管理系统

    C语言使用单链表实现学生信息管理系统

    这篇文章主要为大家详细介绍了C语言使用单链表实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 数据结构与算法中二叉树子结构的详解

    数据结构与算法中二叉树子结构的详解

    这篇文章主要介绍了数据结构与算法中二叉树子结构的详解的相关资料,需要的朋友可以参考下
    2017-04-04

最新评论