动态库

Linux下动态库(.so)和静态库(.a)

匿名 (未验证) 提交于 2019-12-02 21:56:30
动态库和静态库的介绍 库分为两种,一种为静态库,文件名以 .a 结尾,另一种是动态库,文件名以 .so 结尾。静态库和动态库的使用各有利弊。 静态库的特点: 简单, 链接时 直接把静态库中的内容链接到可执行文件中,链接完成后,就不再需要静态库了。 静态库 不能共享 ,所有使用静态库的可执行文件中,都有静态库中的内容,增大了可执行文件的体积,增长了可执行文件装载的时间。。 动态库的特点: 动态库在程序 运行时 才载入,而且程序可以根据需求自主选择载入动态库的时机,所以使用动态库可以加快可执行文件装载的时间。 动态库是 可以共享 的,多个程序在运行中可以使用同一个动态库,可以减少程序总的大小。 一个栗子 //add.h: int add(int a, int b); //add.c: int add(int a, int b) { return a + b; } //sub.h: int sub(int a, int b); //sub.c: int sub(int a, int b) { return a - b; } //main.c: #include "add.h" #include "sub.h" #include <stdio.h> int main() { printf("Result of 1 + 1 is: %d\n", add(1,1)); printf(

Linux链接库三(C跟C++之间动态库的相互调用)

匿名 (未验证) 提交于 2019-12-02 21:56:30
http://www.cppblog.com/wolf/articles/74928.html http://www.cppblog.com/wolf/articles/77828.html http://www.jb51.net/article/34990.htm C和C++之间库的互相调用 extern "C"的理解: 很多人认为"C"表示的C语言,实际并非如此,"C"表示的是一种链接约定,只是因C和C++语言之间的密切关系而在它们之间更多的应用而已。实际上Fortran和汇编语言也常常使用,因为它们也正好符合C实现的约定。 extern "C"指令描述的是一种链接约定,它并不影响调用函数的定义,即时做了该声明,对函数类型的检查和参数转换仍要遵循C++的标准,而不是C。 2.extern "C"的作用: 不同的语言链接性是不同的,那么也决定了它们编译后的链接符号的不同,比如一个函数void fun(double d),C语言会把它编译成类似_fun这样的符号,C链接器只要找到该函数符号就可以链接成功,它假设参数类型信息是正确的。而C++会把这个函数编译成类似_fun_double或_xxx_funDxxx这样的符号,在符号上增加了类型信息,这也是C++可以实现重载的原因。 那么,对于用C编译器编译成的库,用C++直接链接势必会出现不能识别符号的问题,是的,需要extern "C

动态链接库函数内的静态变量,奇妙的UNIQUE Bind

匿名 (未验证) 提交于 2019-12-02 21:53:52
title: 动态链接库函数内的静态变量,奇妙的UNIQUE Bind date: 2018-09-28 09:28:22 tags: --- 模板函数和内敛函数中的静态变量,在跨so中的表现,和定义在其他函数中的静态变量的表现稍微有所不同。使用不慎,会造成预期之外的结果。本文对该现象进行了探讨。 最近遇到一个使用多个共享动态库时,由于静态变量导致的逻辑问题。考虑如下一个问题,主模块要打开A.so和B.so两个动态库,两个动态库的代码使用到了同一个模板函数,而该模板函数有一个静态变量。那么,当两个动态库都加载到内存时,这两个函数间会产生联系吗? 头文件和so的示例代码如下: //so_test.h #include <stdio.h> template<typename T> void print_msg(T) { static int num = 0; num++; printf("msg form , num = %d, \n", num ); printf("-----------------------\n"); } #define EXPORT_DYN_SYM __attribute__ ((visibility ("default"))) extern "C" { EXPORT_DYN_SYM void test_a(); EXPORT_DYN_SYM void

java使用JNA框架调用dll动态库

匿名 (未验证) 提交于 2019-12-02 21:53:52
这两天了解了一下java调用dll动态库的方法,总的有三种:JNI、JNA、JNative。其中JNA调用DLL是最方便的。 ・ JNI ・ JNA ・ JNative 使用JNative调用DLL除了要引入jar包外还需要额外引入一个dll文件,而JNA只需要引入jar即可使用。 使用JNA框架调用DLL动态库,步骤如下 : 1.导入JNA支持的jar包 添加 jna-4.x.x.jar、jna-platform-4.x.x.jar到项目buildpath中( Maven项目可在中央仓库中搜索JNA的相关依赖添加到项目中) 2.代码调用DLL动态库方法 import com.sun.jna.Library; import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.win32.StdCallLibrary; /** * JNA框架DLL动态库读取调用示例类 * @ClassName: DllCall * @Description: 读取调用DLL动态库文件中的方法 * @author : LinWenLi * @date: 2018年7月18日 上午10:32:16 */ public class JNADllCall { /** * DLL动态库调用方法 * @Description:

动态库和静态库的制作与使用 【转载】原文链接https://www.cnblogs.com/WindSun/p/11287927.html

瘦欲@ 提交于 2019-12-02 19:59:12
概述 Linux操作系统支持的函数库分为静态库和动态库,动态库又称共享库。linux系统有几个重要的目录存放相应的函数库,如/lib /usr/lib。 静态函数库:   这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进可执行文件了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译,而且体积也较大。 动态函数库:   这类库的名字一般是libxxx.so,动态库又称共享库;相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。而且如果多个应用程序都要使用同一函数库,动态库就非常适合,可以减小应用程序的体积。 Linux静态函数库的创建和使用 例程add.h add.c sub.h sub.c main.c: add.h #ifndef ADD_H #define ADD_H int add(int x,int y);

关于Unix静态库和动态库的分析

谁都会走 提交于 2019-12-02 18:56:33
库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以.so为文件后缀名。所以为了使用这些库,通常使用建立符号连接的方式。 ln -s libhello.so.1.0 libhello.so.1 ln -s libhello.so.1 libhello.so 1、使用库 当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以 一旦连接成功,静态程序库也就不再需要了 。 然而,对动态库而言,就不是这样。 动态库会在执行程序内留下一个标记指明当程序执行时,首先必须载入这个库 。由于动态库节省空间,linux下进行连接的 缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。 现在假设有一个叫hello的程序开发包,它提供一个静态库libhello.a 一个动态库libhello.so,一个头文件hello.h,头文件中提供sayhello()这个函数 /* hello.h */ void sayhello(); 另外还有一些说明文档。 这一个典型的程序开发包结构 与动态库连接 linux默认的就是与动态库连接

技巧:Linux 动态库与静态库制作及使用详解

五迷三道 提交于 2019-12-02 18:56:19
两个要知道的基本知识 Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行。 Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊。 Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题。 三种标准库链接方式选项及对比 为了演示三种不同的标准库链接方式对最终应用程序产生的区别, 这里用了一个经典的示例应用程序 HelloWorld 做演示,见 清单 1 HelloWorld 。 整个工程可以在文章末尾下载。 清单 1. HelloWorld #include <stdio.h> #include <iostream> using std::cout; using std::endl; int main(int argc, char* argv[]) { printf("HelloWorld!(Printed by printf)\n"); cout<<"HelloWorld!(Printed by cout)"<<endl; return 0; } 三种标准库链接方式的选项及区别见 表 1 表 1. 三种标准库链接方式的选项及区别 标准库连接方式 示例连接选项 优点 缺点 全静态

cygwin和mingw编译软件的疑问

旧巷老猫 提交于 2019-12-02 18:54:58
对于cygwin和mingw的区别已有基本了解。先已有mingw+msys环境,mingw版gcc在mingw官网下载,版本4.5.2,安装了一些的开发库,但在mingw中编译gnu程序,少有顺利通过的,mingw版的gcc编译出来是原生的win32程序。考虑到mingw对linux环境的模拟“不够纯”,重新下载安装cygwin,现只有一个基本的运行环境。可以确定,cygwin中预装的程序(/bin目录下的大量工具)对cyg*.dll的动态库有依赖,目前没有安装cygwin版的gcc。 我的疑问是: 1.直接把mingw版的gcc放到$PATH路径中,这样在cygwin的终端环境中编译gnu软件或者一些开发库和在msys终端编译是一致的效果吗?比如,失败的话,同样的错误;成功的话,同样不依赖于cyg*.dll动态库? 2.通过setup另下一个cygwin版的gcc(其实在cygwin官网上同时看到有gcc和mingw-gcc就很疑惑了),在cygwin的终端环境中编译软件,如果遇到源代码直接调用win32API而不是unix风格的系统调用,cygwin版的gcc能否编译成功? 若可以编译成功,是不是程序运行依赖于上述的dll? 3.同时保留有两个版本的gcc(mingw的和cygwin的),个人想在编译常用工具或开发库(如gnu的工具)时使用cygwin版的,这样在本地运行

gcc 使用中常用的参数及命令

房东的猫 提交于 2019-12-02 18:50:30
1. 执行过程 虽然我们称Gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤∶预处理(也 称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。    命令gcc (1). 首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。 (2). 接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。 (3). 汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。 (4). 当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。 基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: libhello.so.1.0,由于程序连接默认以

Android 之 JNI 开发 详解

自古美人都是妖i 提交于 2019-12-02 18:50:16
NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub - https://github.com/han1202012/NDKHelloworld.git 一. JNI介绍 1. JNI引入 JNI概念 : Java本地接口, Java Native Interface , 它是一个 协议 , 该协议用来沟通Java代码和外部的本地C/C++代码, 通过该协议 Java代码可以调用外部的本地代码, 外部的C/C++ 代码可以调用Java代码; C和Java的侧重 : -- C语言 : C语言中最重要的是 函数 function; -- Java语言 : Java中最重要的是 JVM, class类, 以及class中的方法; C与Java如何交流 : -- JNI规范 : C语言与Java语言交流需要一个适配器, 中间件, 即 JNI, JNI提供了一种规范; -- C语言中调用Java方法 : 可以让我们在C代码中找到Java代码class中的方法, 并且调用该方法; -- Java语言中调用C语言方法 : 同时也可以在Java代码中, 将一个C语言的方法映射到Java的某个方法上; -- JNI桥梁作用 : JNI提供了一个桥梁, 打通了C语言和Java语言之间的障碍; 2. Android中的应用程序框架 正常情况下的Android框架 : 最 顶层 是