动态库

C语言库的制作

耗尽温柔 提交于 2019-12-02 18:50:05
制作C语言库 编写头文件,在文件内声明要用到的函数, libh.h #include <stdio.h> // 两数相加 int add(int a, int b); // 绝对值 int mabs(int a); 编写c语言库源码文件, 在文件内定义之前声明的函数。 libc.c /*两数相加函数*/ int add(int a, int b) { return a+b; } /*一个整型数的绝对值*/ int mabs(int m) { int result = m; if (m < 0) { result = 0-m; } return result; } 生成C语言库 静态库 gcc -c libc.c -o libc.o 将libc.c 编译成二进制文件取名为libc.o ar cr libaku.a libc.o 将libc.o制作成名为libaku.a的静态库 动态库 gcc -c libc.c -o libc.o 将libc.c 编译成二进制文件取名为libc.o gcc -shared -fPIC -o libsku.so libc.o 将libc.o制作成名为libsku.so的动态库 调用C语言库 编写测试程序 main.c #include "libh.h" int main(int argc, char const* argv[]) { int n = 0

gcc编译生成静态及动态链接库步骤

北城以北 提交于 2019-12-02 18:25:57
这两天在看《Linux C程序设计大全》,吴岳编著,清华大学出版社。这本书是在一个培训机构看到的,在网上查了下该书的相关信息。从目录而言,该书涵盖了Linux下C程序设计的较多内容,包括C语言基础(主要讲解C语法结构)、C语言开发环境(主要介绍VIM使用、GCC使用、makefile编写、gdb使用)、Linux进程操作、Linux文件操作、Linux网络编程这几部分。阅读了该书几个小章节,总体而言,书的部分内容较充实,但是存在较多编辑错误,部分样例实际运行时与书中内容不符。 这里使用该书P192-P199的例子,总结下gcc编译静态及动态链接库的方法及步骤。 程序清单如下: test.c文件内容: int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a, int b) { return a / b; } test.h文件内容: #ifndef _TEST_H_ #define _TEST_H_ extern int add(int a, int b); extern int sub(int a, int b); extern int mul(int a, int b);

Go 和 Android 集成实战

狂风中的少年 提交于 2019-12-02 17:45:47
看到这个标题,你可能会问,为什么要在 Android 中运行 Go,直接使用 Java 不挺好吗? 是的,如果你有现成很强大的 Java 团队,这没有问题,但并不是所有团队都是如此。而且我在这里想强调的是 Android 与 Go 的集合,即在 Android 程序中使用 Go 而不是完全用 Go 来写 Android 程序。 我能想到在 Android 中用 Go 的一些原因: 团队熟悉 Go, 对 Java/Android 了解不多。 已经有现成的 Go 核心代码,比如开源类库: libp2p,turn/stun 类库等。 自己服务的 SDK 其核心逻辑复杂,繁琐,涉及大量网络或并发的操作。 能够在 Android 上使用 Go 代码,得益于 Go 强大的交叉编译能力,那该如何在 Android 上使用我们的 Go 库呢,接下来我将通过一个简单的示例来讲解。 实例教程 本例是在 Android 程序中使用 Go 编译的一个简单动态库来实现对网站测速的简单例子。 思路: Go 交叉编译为 Android 平台支持的 so 文件。 在 Android 中使用 JNA 调用该 so 文件。 依赖: Go NDK r20 JNA 5.4.0 说明: 演示环境为 Mac。 编写 Go 测试代码 编写 speedtester 的核心代码,实现对任意网站访问速度的检测: package

CentOS 6.2 下编译使用Libvlc

巧了我就是萌 提交于 2019-12-02 16:48:42
总的来说把VLC内嵌入自己的应用有4种途径: •直接调用VLC进程 •VLC的plugin for Mozilla •VLC的ActiveX插件 •调用libvlc 最近需要VLC动态库做开发,故需要编译vlc,并修改VLC 将自己的API借口添加到Lib动态库中。 下面来编译VLC2.0.1,从官网下载最新VLC。(新版本的VLC需要gcc和glibc的支持,所以使用centOS 6.2或者ubunt10.0版本) 如果想要加载全部功能,需要安装如下库 yum install a52dec a52dec-devel caca-utils dirac dirac-devel expat expat-devel faac faac-devel faad2 faad2-devel ffmpeg \ ffmpeg-libs flac flac-devel fribidi-devel gettext gnutls gnutls-devel gnutls-utils lame lame-devel live555 live555-devel \ libass libass-devel libcaca libcaca-devel libcddb libcddb-devel libcdio libcdio-devel libdap libdap-devel libdca-devel \

使用GDB调试将符号表与程序分离后的可执行文件

一曲冷凌霜 提交于 2019-12-02 14:58:50
环境:   Centos7.3、GCC4.8.5 适用场景:   由于调试信息比较大,通常将程序分离为可执行程序和符号信息文件,只对外发布可执行程序,需要调试时再将符号信息文件附加。 一、创建可执行程序:   use_library.cpp #include <iostream> #include "use_library.h" int main() { int res = my_library(1, 2); std::cout << "my_library:" << res << std::endl; }   CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(use_libray) include_directories(/root/my_library) link_directories(/root/my_library/cmake) aux_source_directory(. DIR_SRCS) add_executable(use_library ${DIR_SRCS}) target_link_libraries(use_library my_library) 二、创建动态库:   my_library.h int my_library(int a, int b);   my_library.cpp

C# - *.dll vs *.lib (动态链接库 vs 静态链接库)

点点圈 提交于 2019-12-02 12:34:53
静态库 库(Library)就是一段 编译好的二进制代码 ,加上头文件就可以使用。 静态链接库(Windows 下的*.lib, Linux & Mac 下的 .a)。之所以叫做静态,是因为静态库在 编译 的时候会被直接拷贝一份,复制到目标程序里,这段代码在目标程序里就不会再改变了。 优点: 1、编译完成之后,库文件实际上就没有作用了。目标程序没有外部依赖,直接就可以运行。 2、代码装载速度快,执行速度略比动态链接库快。 缺点: 1、会使用目标程序的体积增大。 2、包含相同的公共代码,造成浪费,扩展性较差。 动态库 动态链接库(Windows 下的*.dll, Linux & Mac 下的 .dylib)。与静态库相反,动态库在编译时并不会被拷贝到目标程序中,目标程序中只会存储指向动态库的引用。等到程序运行时,动态库才会被真正加载进来。 优点: 1、不需要拷贝到目标程序中,不会影响目标程序的体积,而且同一份库可以被多个程序使用(因为这个原因,动态库也被称作共享库)。同时,编译时才载入的特性,也可以让我们随时对库进行替换,而不需要重新编译代码。 2、更加节省内存并减少页面交换。 3、可维护性和可扩展性高。 4、适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。 缺点: 1、动态载入会带来一部分性能损失,使用动态库也会使得程序依赖于外部环境。

C语言学习之动态加载

独自空忆成欢 提交于 2019-12-02 11:49:56
(一)相关函数 在使用动态库的过程中,a.out回车加载器调用动态连接器,属于一个自动的加载,程序中可以由程序员向系统发起申请,将库加载到内存,这种叫 动态加载 。 dlopen(3) dlclose(3) dlerror(3) dlsym(3) … 注意:使用这些函数,在编译的时候,要加上选项 -ldl,即链接库名为dl的库 void *dlopen(const char* filename, int flags) filename: 指定加载共享库的文件名,为空返回main flags : RTLD_LAZY : 只有在动态库里的符号被引用的时候才 RTLD_NOW:立即引用 返回值:错误返回NULL 成功返回非NULL。可以使用dlerror()诊断函数的错误的原因 int dlclose(void *handle); 功能:关闭共享库(引用计数减1,减到0就从内存unload) handle: 指定要关闭的共享库 返回:成功0 失败非0 char *dlerror(void); 功能:获取动态链接器提供的API函数中的错误的诊断信息 返回值:错误信息字符串 void *dlvsym(void *handle, char *symbol, char *version); 功能:从共享库里找到符号的地址,并返回 handle:指定共享库 symbol :指定符号的名字 返回值

Linux下动态链接与静态链接

半腔热情 提交于 2019-12-02 05:25:45
一、首先我们来说一下库的基础概念: 在windows平台和linux平台下都大量存在着库。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。由于windows和linux的本质不同,因此二者库的二进制是不兼容的。通俗的说就是把这些常用函数的目标文件打包在一起,提供相应函数的接口,便于程序员使用。在使用函数时,只需要包对应的头文件即可。按照库的使用方式又可分为动态库和静态库,在不同平台下对应后缀也有所不同。 WINDOWS下:.dll 后缀为动态库,.lib 后缀为静态库; LINUX下:.so后缀为动态库,.a后缀为静态库。 比较 静态库 动态库 概念 静态链接库就是一个多个汇编文件(obj文件)的集合,在Linux中通常命名为libxxx.a。对于静态链接库函数的连接是在编译阶段,直接将obj文件的一份拷贝代码连接到目标文件。 动态链接库也是一个或多个汇编文件的集合,在Linux中通常命名为libxxx.so。对于动态链接库函数的链接是在运行阶段,各个目标程序之间共享同一份库文件。在编译阶段仅仅加载了函数符号。 优点 在编译阶段就完成连接,不需要单独库文件。(简单、直接、粗暴)。 1) 代码共享,当多个程序运行同一个动态库的时候,其实他们是共享的同一份代码。减少了内存的使用量。2)按需加载,只有当运行过程中需要使用动态库的函数,才会去加载动态库

iOS开发之Xcode打包framework

依然范特西╮ 提交于 2019-12-02 04:15:18
下文是转载,本人觉得这个打包framework还是一个比较重要的功能,可以用来做一下事情: (1)封装功能模块,比如有比较成熟的功能模块封装成一个包,然后以后自己或其他同事用起来比较方便。 (2)封装项目,有时候会遇到这个情况,就是一家公司找了两个开发公司做两个项目,然后要求他们的项目中的一个嵌套进另一个项目,此时也可以把呗嵌套的项目打包成framework放进去,这样比较方便。 我们为什么需要框架(Framework)? 要想用一种开发者友好的方式共享库是很麻烦的。你不仅仅需要包含库本身,还要加入所有的头文件,资源等等。 苹果解决这个问题的方式是框架(framework)。基本上,这是含有固定结构并包含了引用该库时所必需的所有东西的文件夹。不幸的是,iOS禁止所有的动态库。同时,苹果也从Xcode中移除了创建静态iOS框架的功能。 Xcode仍然可以支持创建框架的功能,重启这个功能,我们需要对Xcode做一些小小的改动。 把代码封装在静态框架是被app store所允许的。尽管形式不同,本质上它仍然是一种静态库。 框架(Framework)的类别 大部分框架都是动态链接库的形式。因为只有苹果才能在iOS设备上安装动态库,所以我们无法创建这种类型的框架。 静态链接库和动态库一样,只不过它是在编译时链接二进制代码,因此使用静态库不会有动态库那样的问题

iOS中制作可复用的框架Framework

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 04:14:43
iOS中制作可复用的框架Framework 在iOS开发中,我们时常会使用一些我们封装好的管理类,框架类,方法类等,我们在实现这些文件时,可能还会依赖一些第三方库或者系统库。如果每次我们复用这些代码时,都要将关联的这些东西进行导入,甚至还要进行arc和mrc的编译设置,会浪费我们很大的精力。除此之外,如果项目需要多人合作,你可能也并不希望你的源代码暴漏在所有人的面前,这个时候,我们就可以使用静态库或者动态库的方式来对我们的代码进行包装,便于复用。静态库的制作方法在一篇旧的博客中有描述: http://my.oschina.net/u/2340880/blog/398887 。相比静态库文件,动态库的效率会更高且封装性更好,这里主要讨论动态库的制作。 xcode6后支持在xcode中制作动态库,并且过程也十分简单。 新建一个项目,选择framework: 之后我们在里面编写我们的代码,比如我们创建一个MyObject类: ? 1 2 3 4 5 6 7 8 9 @interface MyObject : NSObject -( void )myLog; @end @implementation MyObject -( void )myLog{ NSLog(@ "framework" ); } @end 和静态库类似,如果我们不做任何处理