cmake:善用find_package()提高效率暨查找JNI支持

cmake提供了很多实用的cmake-modules,通过find_package()命令调用这些modules,用于写CMakeLists.txt脚本时方便的查找依赖的库或其他编译相关的信息,善用这些modules,可以提高写脚本的效率和脚本通用性。
说起来真的有点太抽象,举个我最近遇到的简单例子吧。
我们写java的JNI接口代码时,肯定是需要jni.h文件的,那么在写cmake脚本中,就需要找到你当前电脑的jni.h的安装位置加入include搜索路径(对了还需要 jni_md.h的位置)。
下面是我原先用于定位jni.h以及jni_md.h的位置,并将其加入到include搜索路径中的cmake脚本。

通过 JAVA_HOME环境变量定位 jni.h和jni_md.h
if(NOT DEFINED ENV{JAVA_HOME})
    # 没有找到JAVA_HOME环境变量,输出错误信息退出
    message(FATAL_ERROR "not defined environment variable:JAVA_HOME")
endif()
set(JNI_INCLUDE "$ENV{JAVA_HOME}/include")
jni.h的位置加入搜索路径
include_directories(${JNI_INCLUDE})
判断操作系统,添加jni_md.h搜索路径
if(WIN32)
    #win32系统下jni_md.h位于/win32下
    include_directories("${JNI_INCLUDE}/win32")
elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
    #linux系统下jni_md.h位于/linux下
    include_directories("${JNI_INCLUDE}/linux")
else()
    # 不支持的操作系统报错退出
    message(FATAL_ERROR "other unsupported platform: ${CMAKE_SYSTEM_NAME}")
endif(CMAKE_SYSTEM_NAME MATCHES "Windows")

写了一堆代码,只满足了windows和linux下的jni支持查找。
其实cmake本身就提供了一个叫 FindJNI的modules,调用它就可以获取关于JNI配置的一切变量。

FindJNI
Find JNI java libraries.

This module finds if Java is installed and determines where the include files and libraries are. It also determines what the name of the library is. The caller may set variable JAVA_HOME to specify a Java installation prefix explicitly.

This module sets the following result variables:

JNI_INCLUDE_DIRS      = the include dirs to use
JNI_LIBRARIES         = the libraries to use
JNI_FOUND             = TRUE if JNI headers and libraries were found.

JAVA_AWT_LIBRARY      = the path to the jawt library
JAVA_JVM_LIBRARY      = the path to the jvm library
JAVA_INCLUDE_PATH     = the include path to jni.h
JAVA_INCLUDE_PATH2    = the include path to jni_md.h
JAVA_AWT_INCLUDE_PATH = the include path to jawt.h

使用FindJNI,前面的cmake脚本就可以改成下面这样:

加入REQUIRED 参数,如果找不到JNI,就报错退出
find_package(JNI REQUIRED)
加入jni支持
include_directories(${JAVA_INCLUDE_PATH})
include_directories(${JAVA_INCLUDE_PATH2})

只有三行。。。而且对所有平台适用!
尼玛,知识改变命运呐,早知道这么个神器,我费那劲写辣么多代码干嘛呀,不查手册活该受累呀。
在cmake手册关于《cmake-modules》(点击打开链接)的页面中你还能找到更多常用的第三方库的modules
关于find_package()命令更详细的用法参见:https://cmake.org/cmake/help/v3.1/command/find_package.html#command:find_package

https://cmake.org/cmake/help/v3.1/manual/cmake-packages.7.html

Original: https://www.cnblogs.com/zhujiabin/p/10605456.html
Author: 星辰之力
Title: cmake:善用find_package()提高效率暨查找JNI支持

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/545740/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 上周热点回顾(7.11-7.17)

    热点随笔: · 一次线上事故,我顿悟了异步的精髓 (勇哥编程游记)· 跟HR在大群吵架是什么体验? (叶小钗)· 利用噪声构建美妙的 CSS 图形 (ChokCoco)· .NET…

    技术杂谈 2023年5月31日
    093
  • 持续集成

    本文简要介绍持续集成的概念和做法。 一、概念 持续集成指的是,频繁地(一天多次)将代码集成到主干。 它的好处主要有两个。 (1)快速发现错误。每完成一点更新,就集成到主干,可以快速…

    技术杂谈 2023年5月31日
    099
  • MySQL数据库规范

    MySQL数据库规范 前言 今天我们来聊一聊MySQL数据库常见的一些建议设计规范,参考阿里的《JAVA开发手册泰山版》,我们简单挑出几处进行简单分析和回顾复习,如果有不正确或者不…

    技术杂谈 2023年6月21日
    094
  • 八、变量与常量

    一、变量 1.1、变量的基本概念 Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名、变量类型和作用域。 type varN…

    技术杂谈 2023年6月21日
    0111
  • 高精度PTP时钟服务器(PTP网络时钟同步)技术参数书

    高精度PTP时钟服务器(PTP网络时钟同步)技术参数书 高精度PTP时钟服务器(PTP网络时钟同步)技术参数书 京准电子科技官微——ahjzsz 一、PTP网络时钟服务器产品概述 …

    技术杂谈 2023年6月21日
    0107
  • 查看功能所挂在的菜单

    –查看功能所挂在的菜单alter session set nls_language =’AMERICAN’;alter session set …

    技术杂谈 2023年6月1日
    0113
  • docker学习:docker安装

    Centos7 安装docker 下载安装yum install docker-ce 启动dockersystemctl start docker 创建并编写镜像加速文件vim /…

    技术杂谈 2023年7月10日
    080
  • Sketch for mac(专业矢量绘图设计软件)中文版

    Original: https://www.cnblogs.com/123ccy/p/16540986.htmlAuthor: -Mac123-Title: Sketch for …

    技术杂谈 2023年5月31日
    094
  • 登录页面和FORM的职责不对称,处理方法,刷新工作流程

    登录页面和FORM的职责不对称,处理方法,刷新工作流程: Original: https://www.cnblogs.com/quanweiru/p/9219829.htmlAut…

    技术杂谈 2023年6月1日
    085
  • Mysql InnoDB Redo log

    参考书籍《mysql是怎&…

    技术杂谈 2023年7月25日
    0105
  • cron(CronTrigger)表达式用法

    CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的…

    技术杂谈 2023年5月30日
    0108
  • SpringBoot整合阿里云短信服务

    准备工作 开通短信服务(可参考博主的”手机短信验证码”) 如果开通不成功,就只能借下别人已经开通好的短信,如果不想重复,可在其下创建一个新的模板管理 这里只…

    技术杂谈 2023年6月21日
    0137
  • ElasticSearch7集群+Keepalived

    ElasticSearch7集群+Keepalived 环境说明 三台centos7虚拟机 服务器 内存 192.168.1.153 内存10G 192.168.1.154 内存1…

    技术杂谈 2023年5月31日
    073
  • [学习笔记]Java抽象类

    抽象类 在Java中所有的对象都是通过类来描述的,但不是所有的类都用于描述对象,抽象类就是这样一种存在; 抽象类不能用于实例化对象,但它也可以拥有普通类一样的成员变量、成员方法和构…

    技术杂谈 2023年7月24日
    079
  • legend3—laravel报419错误

    legend3—laravel报419错误 一、总结 一句话总结: js中对象写成了数组,导致后端读不到csrf的token报错 二、legend3—lar…

    技术杂谈 2023年5月30日
    085
  • Golang中常用的代码优化点

    Golang中常用的代码优化点 大家好,我是轩脉刃。 这篇想和大家聊一聊golang的常用代码写法。在golang中,如果大家不断在一线写代码,一定多多少少会有一些些代码的套路和经…

    技术杂谈 2023年6月1日
    0100
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球