动态库尤其是共享库在 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. crop层

    A是要进行剪裁的blob,B是参考,C是由A剪裁出来的输出. 模式1和模式2不同在于offset,模式1中每个dimension可以不同,模式2中用一个值表示了所有dimension的值. axis表 ...

  2. Robotium实践之路源码创建测试项目

    1.JDK安装及环境配置 2.Eclipse安装 3.ADT插件安装 4.模拟器安装 5.准备源码 6.引进源码置项目中 .文件 .导入 .选择现有项目置工作空间中 .浏览 .选择项目,选择模拟器版本 ...

  3. java中regex参考

    在Sun的Java JDK 1.40版本中,Java自带了支持正则表达式的包,本文就抛砖引玉地介绍了如何使用java.util.regex包. 可粗略估计一下,除了偶尔用Linux的外,其他Linu ...

  4. java在线聊天项目0.9版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能之客户端接收

    客户端要不断接收服务端发来的信息 与服务端不断接收客户端发来信息相同,使用线程的方法,在线程中循环接收 客户端修改后代码如下: package com.swift; import java.awt.B ...

  5. URAL1561 Winnie the Pooh

    题目描述: vjudge 题解: 高消(线性基)模$7$. 可以算是板子了. 具体见代码: #include<cstdio> #include<cstring> #includ ...

  6. errno的定义

    ./include/asm-generic/errno-base.h -->包含errno=~ ./arch/arm/include/asm/errno.h -->包含/include/a ...

  7. Makefile学习(二)----生成静态库文件

    Lunix下编译静态库文件: .o后缀文件:编译生成的中间代码文件: .a后缀文件:静态库文件,编译的时候会合到可执行程序中,文件比较大: .so后缀文件:动态库文件,只是一个指向,不会合到可执行程序 ...

  8. 利用visual studio 搜索替换功能清除项目中javascript文件的debugger;

    在做web项目中,写js代码时候,会有一堆的debugger;,当时又懒得删,后面就多起来了,在vs的编辑器里面,其查找替换功能支持正则和整个项目/解决方案替换,这样就很容易删掉debugger;,方 ...

  9. 16,re模块的常用方法

    ret =re.findall('\d+', 'eva123egon4yuan567') print(ret)#返回满足条件的结果 ,放在一个列表里. ret2 = re.search('\d+',' ...

  10. python知识点拾遗

    内容概要 1.__str__ 2.os.path相关方法 1.__str__ 我们先定义一个Student类,打印一个实例: class Student(object): def __init__(s ...