动态库尤其是共享库在 Linux 环境下普遍存在库文件名包含版本号的情况,比如 Linux 环境下经常会发现一个共享库的真实文件名是 libfoo.so.1.1.0,而同时会有多个指向该真实库文件的软连接短文件名:libfoo.so.1.1、libfoo.so.1、libfoo.so。那么我们在使用 GCC 开发程序时如果要用这样的共享库输出的函数,就需要到动态链接这样的共享库(我们这里不考虑静态链接的方式),那么和库文件就有很大关系。另一方面,JNA 中载入共享库,根据其文档我们一般都只使用库的短文件名,比如载入 libfoo.so,我们只需要在 JNA 中指定库文件名为 foo,那么针对真实的长库文件名,又当如何?

1、GCC 使用动态库/共享库

如果使用 GCC 开发程序需要用到共享库提供的函数,且采用动态链接该共享库的话,需要用到 -l 参数。比如动态链接 libfoo.so 这个共享库,参数指定为 -lfoo。但是现实情况是,如果共享库的文件名是 libfoo.so.1.1.0 这样的,而且默认情况下没有 libfoo.so 的软连接,那么 -lfoo 这种方式会出错。所以,此时你可以手工创建一个软连接,用 libfoo.so 这样的不含版本号的共享库文件名指向实际的共享库文件,那么 -lfoo 参数执行时就不会出错了。这样生成的程序,在运行时,即使 libfoo.so 这样的软连接不存在,也不会有问题,会自动找到共享库并将其载入,因为在实际的共享库生成时,就已经在共享库内部指定了寻找共享库时所依赖的名称,有可能是 libfoo.so.1,也有可能是 libfoo.so.1.1……这个取决于共享库在创建时是如何指定唯一的库名称的。

2、GCC 生成动态库/共享库

这里只讨论使用 NetBeans 搭配 GCC 的开发情况。其实主要就是在于控制目标文件名的生成,对于 Linux、Windows 都是适用的。

3、JNA 使用动态库/共享库

JNA 是 Java 中取代 JNI 的最好实现。JNA 中载入动态库、共享库很简单,使用 Native.loadLibrary() 方法即可。根据 JNA 文档,Native.loadLibrary() 方法中指定库文件名一般都是短文件名,不需要含 .dll 以及 lib 和 .so 字符串,比如,Windows 环境下载入 foo.dll,则 Native.loadLibrary() 方法中的库文件名指定为 foo 即可;Linux 环境下载入 libfoo.so,则 Native.loadLibrary() 方法中的库文件名指定为 foo 即可。但是针对 GCC 生成的 libfoo.dll(Windows 环境下)以及 libfoo.so.1.1.0 这两种情况,JNA 文档并没有细说,只是提到 NativeLibrary 这个类的 getInstance() 方法可以指定上面的库短名称,也可以指定带版本号的长名称。后来测试发现,Native.loadLibrary() 方法也是支持库短名称和带版本号的长名称的,因为猜测 NativeLibrary.getInstance() 方法就是 Native 类内部使用的。同时测试还发现,Native.loadLibrary() 方法使用短名称时,能够自动侦测并适应库文件名是否有 lib 前缀以及是否带有版本号。比如,在 Windows 环境下,libfoo.dll 这种情况,使用 foo 作为短名称,JNA 也是能够自动识别并支持的。在 Linux 环境下,libfoo.so.1.1.0 这种情况,使用 foo 作为短名称,JNA 也能够自动识别并支持。当然,你使用完整的长文件名也没有问题。

有关 GCC 及 JNA 涉及动态库/共享库时处理库文件名的问题的更多相关文章

  1. linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)

    一.linux操作系统支持的函数库分支 静态库:libxxx.a,在编译时就将库编译进可执行程序 优点:程序的运行环境中不需要外部的函数库 缺点:可执行程序大 动态库:又称共享库,libxxx.so, ...

  2. gcc编译工具生成动态库和静态库

    一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...

  3. ndk学习9: 动态使用共享库

    动态使用共享库函数 dll_main      环境介绍 续上节代码 目录结构:   android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEA ...

  4. gcc编译工具生成动态库和静态库之一----介绍

     1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...

  5. gcc 库路径里同时有相同文件名的动态库和静态库

    找不到库的处理方案 有两种方法: 一.可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行). 二.把当前路径加 ...

  6. Linux下库的制作(静态库与共享库)

    库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...

  7. Qt 共享库(动态链接库)和静态链接库的创建及调用

    前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...

  8. 使用动态链接为什么还需要静态库lib文件

    在Windows上使用动态链接时,不光需要头文件 .dll文件 还需要一个.lib 文件. 不是动态链接吗?为什么还需要静态库.lib文件? 实际上,这个.lib文件并不是静态库,而是 导入库 文件, ...

  9. EPLAN部件库共享方法

    EPLAN部件库共享方法       关键词: EPLAN部件库共享 EPLAN 摘要:在使用EPLAN时经常会碰到自己电脑里的部件库和公司里其他同事的部件库存在差异,如果不是很平凡的同步所有使用的部 ...

随机推荐

  1. 双击窗体是模拟键盘上的Tab键

    实现效果: 知识运用: SendKeys类的Send方法 //向活动应用程序发送击键 public static void Send (string keys) 实现代码: private void ...

  2. uaf-湖湘杯2016game_学习

    0x00 分析程序 根据分析,我们可以得到以下重要数据结构 0x01 发现漏洞 1.在武器使用次数耗光后,程序会把存储该武器的堆块free,在free的时候没有清空指针,造成悬挂指针 2.commen ...

  3. EOF与feof

    在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file).在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件.在文本文件中,数据都是 ...

  4. $Codeforces\; Round\; 504\; (Div.2)$

    宾馆的\(\rm{wifi}\)也太不好了,蹭的\(ZZC\)的热点才打的比赛(感谢\(ZZC\)) 日常掉rating-- 我现在是个\(\color{green}{pupil}\)-- 因为我菜, ...

  5. 使用 ss 命令查看连接信息

    作用:打印主机socket连接信息,netstate可以做的它都可以做,比netstate 更灵活,而且由于ss使用 tcp_diag 内核模块,所以速度更快. 用法: ss [ OPTIONS ] ...

  6. 2018-10-09中国裁判文书网爬虫vl5x和DocID分析

    本来是想要抓取食药监的药品数据,看到js加密很繁琐,调了一个星期没有结果,想看看其他类似网站的js加密情况,发现裁判文书网的加密好像不是太复杂,经过两天的分析和编写,基本把vl5x加密和DocID解密 ...

  7. 【css】修改placeholder 默认颜色

    html5为input添加了原生的占位符属性placeholder,高级浏览器都支持这个属性,例如: <input type="text" placeholder=" ...

  8. 【实验吧】因缺思汀的绕过&&拐弯抹角&&Forms&&天网管理系统

    <?php error_reporting(); if (!isset($_POST['uname']) || !isset($_POST['pwd'])) { echo '<form a ...

  9. Hive元数据启动失败

    Caused by: java.net.ConnectException: Connection refused (Connection refused) at java.net.PlainSocke ...

  10. Knockout v3.4.0 中文版教程-2-监控-通过监控创建视图模型(上)

    2. 监控 1.通过监控创建视图模型 1. 监控 Knockout是基于以下三个核心特性: 监控和依赖跟踪 声明式绑定 模板 在本节,你将第一次了解这三个特性,在这之前,我们先来了解以下MVVM模式和 ...