有关 GCC 及 JNA 涉及动态库/共享库时处理库文件名的问题
动态库尤其是共享库在 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 涉及动态库/共享库时处理库文件名的问题的更多相关文章
- linux 静态库和动态库(共享库)的制作与使用(注意覆盖问题)
一.linux操作系统支持的函数库分支 静态库:libxxx.a,在编译时就将库编译进可执行程序 优点:程序的运行环境中不需要外部的函数库 缺点:可执行程序大 动态库:又称共享库,libxxx.so, ...
- gcc编译工具生成动态库和静态库
一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...
- ndk学习9: 动态使用共享库
动态使用共享库函数 dll_main 环境介绍 续上节代码 目录结构: android.mk如下: LOCAL_PATH := $(call my-dir) include $(CLEA ...
- gcc编译工具生成动态库和静态库之一----介绍
1.库的分类 根据链接时期的不同,库又有静态库和动态库之分. 静态库是在链接阶段被链接的(好像是废话,但事实就是这样),所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. ...
- gcc 库路径里同时有相同文件名的动态库和静态库
找不到库的处理方案 有两种方法: 一.可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行). 二.把当前路径加 ...
- Linux下库的制作(静态库与共享库)
库中实际上就是已编译好的函数代码,可以被程序直接调用. Linux下的库一般的位置在/lib或者/usr/lib中 静态库 静态库是复制拷贝到调用函数中的,函数运行的时候不再需要静态库,因为静态库是在 ...
- Qt 共享库(动态链接库)和静态链接库的创建及调用
前言: 编译器 Qt Creator, 系统环境 win7 64 位 1.创建共享库: 新建文件或项目->选择 Library 和 c++ 库->选择共享库->下一步(工程名为 sh ...
- 使用动态链接为什么还需要静态库lib文件
在Windows上使用动态链接时,不光需要头文件 .dll文件 还需要一个.lib 文件. 不是动态链接吗?为什么还需要静态库.lib文件? 实际上,这个.lib文件并不是静态库,而是 导入库 文件, ...
- EPLAN部件库共享方法
EPLAN部件库共享方法 关键词: EPLAN部件库共享 EPLAN 摘要:在使用EPLAN时经常会碰到自己电脑里的部件库和公司里其他同事的部件库存在差异,如果不是很平凡的同步所有使用的部 ...
随机推荐
- Html5怎么导出图片
其实很简单, 首先需要两个js文件 jquery.min.js html2canvas.js 直接上代码,几行就解决了 <a id="example1" onclick=&q ...
- CPP-基础:运算符重载详解
1.运算符重载定义: C++中预定义的运算符的操作对象只能是基本数据类型.但实际上,对于许多用户自定义类型(例如类),也需要类似的运算操作.这时就必须在C++中重新定义这些运算符,赋予已有运算符新的功 ...
- pseudogene|鉴定功能基因|expressed se|quence tag
基因 (鉴定DNA:可以直接利用DNA序列鉴别基因,但存在3个问题) 1.intron太长(使用用来连接的算法不可及) 2.因为通常功能基因的第一个oxen中有非编码区和启动子最后一个oxen中有终止 ...
- Js图片缩放代码 鼠标滚轮放大缩小 图片向右旋转
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- ios之UIImageView
UIImageView,顾名思义,是用来放置图片的.使用Interface Builder设计界面时,当然可以直接将控件拖进去并设置相关属性,这就不说了,这里讲的是用代码. 1.创建一个UIImage ...
- JS与IOS、安卓的交互
最近做的项目中涉及到了与安卓和ios的交互问题,对于一个新手来说,多多少少会有点迷糊.在调用安卓和ios的callback回调时,很轻松的就调用成功了,而且,步骤也不那么繁琐.刚开始,只知道那样使用可 ...
- Git学习之路
目录 git安装 linux windows git命令 创建版本库 提交文件 仓库状态 版本回退 工作区和暂存区 工作区 暂存区 推送.下拉和克隆 推送 下拉 克隆 git应该可以说是程序员必备技能 ...
- [LUOGU]P1443 马的遍历
题目描述 有一个n*m的棋盘(1< n,m<=400),在某个点上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步 输入输出格式 输入格式: 一行四个数据,棋盘的大小和马的坐标 输 ...
- 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...
- Linux文件权限与文件夹权限实践
文件权限在基础中有介绍,不在重复 一.文件夹权限: 示例: 解释说明: r --read 既ls w --write 既创建新的目录或者文件 x --execute 既cd 现在有4个用户分属 ...