动态库尤其是共享库在 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. WPF知识点全攻略03- XAML

    XAML 是一种声明性标记语言,XAML 是一种基于 XML 并对 XML 结构规则进行了扩展. XAML特点: 定义应用程序的界面元素 显示的声明WPF资源(样式.模板.动画等) 可扩展性(自定义U ...

  2. html5文本超过指定行数隐藏显示省略号

    这个很简单,直接贴代码就好了 HTML <span class="name">博客园是一个面向开发者的知识分享社区.自创建以来,博客园一直致力并专注于为开发者打造一个纯 ...

  3. CentOS7——防火墙设置

    1.查看firewall服务状态 systemctl status firewalld 2.查看firewall的状态firewall-cmd --state 3.开启.重启.关闭.firewalld ...

  4. tp5对接支付宝支付简单集成

    对于每个刚开始工作的新手来说,无论支付宝支付还是微信支付都是跑不掉的一个小门槛. 在加上本人比较技术比较渣(比较懒导致的),不太喜欢引用那么大的SDK,于是就简单集成了一下支付宝的支付. 但也只是只有 ...

  5. python3.x中的33个保留字

    Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32 Type " ...

  6. odoo Windows10启动debug模式报错(Process finished with exit code -1073740940 (0xC0000374))

    之前用win10系统,安装odoo总是启动debug模式启动不起来很恼火. 报错问题:Process finished with exit code -1073740940 (0xC0000374) ...

  7. LeetCode(102) Binary Tree Level Order Traversal

    题目 Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to rig ...

  8. 杭电 1159 Common Subsequence

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  9. 牛客网暑期ACM多校训练营(第五场)F take(概率, 递推)

    链接: https://www.nowcoder.com/discuss/84119 题意: 给定n个箱子, 每个箱子打开发现钻石的概率P(这里的P要除100), 每个钻石的重量, 有一个人只能持有一 ...

  10. JavaScript正则表达式-字符类

    字符列表 在方括号内指定一个或者多个字符组成的字符列表,与字符列表中任意字符匹配,都被认为是匹配的.每次匹配只能匹配列表中的一个字符. str = "bird,head,fed,meadow ...