动态库

静态库知识小记

你。 提交于 2019-12-01 23:46:56
1.静态库简介 1.1.静态库的简介   库就是程序代码的集合,是共享程序代码的一种方式 1. 2.库的分类   (1)开源库:公开源代码,能看到具体实现   (2)闭源库:不公开源代码,是经过编译后的二进制文件,看不到具体实现;其中包括:静态库和动态库 1. 3.静态库的存在形式   (1).a   (2).framework 1. 4.动态库的存在形式   (1).dylib   (2).framework 1. 5.静态库和动态库的区别   (1)静态库在链接时,会被完整的复制到可执行文件中,被多次使用,就有多份拷贝   (2)动态库则不会复制,只有一份,程序运行时动态加载到内存;系统只加载一次,多个程序公用,节省内存;   (3)!!!项目中如果使用到自己的动态库,不允许上架!!!,在iOS8开发了动态加载dylib的接口 1. 6.静态库应用场景   (1)保护自己的核心代码,例如,国内的企业,掌握有核心技术,同时又希望更多的程序员来使用其技术,如,百度地图、友盟等   (2)将MRC的项目,打包成静态库,可以在ARC下直接使用,不需要转换 2.静态库的制作(.a) 2.1 生成静态库的步骤   (1)创建生成.a静态库的项目,如下图    (2)创建完后,如下图,添加一个log的方法    (3)选择模拟器或者Generic iOS Device, command +

执行dlsym()函数出现: undefined symbol

大城市里の小女人 提交于 2019-12-01 23:03:56
执行dlsym()函数出现: undefined symbol 执行dlsym()函数出现: undefined symbol 当这个问题出现的时候,可以检查产生so文件的cpp文件,看看是否已经用 extern C{ /* code here */} 把C++的函数包裹起来 文章最后发布于: 2018-09-05 18:50:59有 0 个人打赏如果不想穷一辈子:读懂三不卖七不买是关键,可惜无人知晓股管家 · 顶新 dlsym使用阅读数 208dlsymhttp://baike.baidu.com/view/1093952.htm?fr=aladdin功能:根据动态链接库操作句柄与符号,返回符号对应的地址。包含头文件:#include&am...博文来自:Puten_20120813的博客动态链接时出现undefined symbol错误阅读数 7376有时候编译生成程序时,会出现undefinedsymbol:XXX错误,比如编译python的sqlite模块时,出现这样的错误可以使用nm命令,查看依赖的库是否含有这个XXX,以上面的编译pytho...博文来自:N_sev7的Blogdlopen 和 dlsym 动态调用函数阅读数 290Linux/unix提供了使用dlopen和dlsym方法动态加载库和调用函数,这套方法在macOS和iOS上也支持。dlopen打开一个库

动态库的链接和链接选项-L,-rpath-link,-rpath

左心房为你撑大大i 提交于 2019-12-01 10:41:48
链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共享库的位置。linux的可执行程序在执行的时候默认是先搜索/lib和/usr/lib这两个目录,然后按照/etc/ld.so.conf里面的配置搜索绝对路径。同时,Linux也提供了环境变量LD_LIBRARY_PATH供用户选择使用,用户可以通过设定它来查找除默认路径之外的其他路径,如查找/work/lib路径,你可以在/etc/rc.d/rc.local或其他系统启动后即可执行到的脚本添加如下语句:LD_LIBRARY_PATH =/work/lib:$(LD_LIBRARY_PATH)。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找(详细参考《使用LD_LIBRARY_PATH》)。 不过LD_LIBRARY_PATH的设定作用是全局的,过多的使用可能会影响到其他应用程序的运行,所以多用在调试。(LD_LIBRARY_PATH的缺陷和使用准则,可以参考《Why LD_LIBRARY_PATH is bad》 )。通常情况下推荐还是使用gcc的-R或-rpath选项来在编译时就指定库的查找路径,并且该库的路径信息保存在可执行文件中,运行时它会直接到该路径查找库,避免了使用LD_LIBRARY_PATH环境变量查找。 链接选项和路径 现代连接器在处理动态库时将链接时路径(Link-time

创建C语言静态库与动态库

你离开我真会死。 提交于 2019-12-01 10:41:01
“程序库”就是包含了一些同音函数的数据和二进制可执行机器码的文件。这些文件是目标文件的一种,其不能单独执行。但是如果将其与其他的可执行代码结合起来就可以执行。这些目标文件通常可以完成同一类功能,他们可以作为其他执行程序的一部分来执行。由于库的存在,使得用户编写的程序模块化更强,从而可以加强程序的再编译,提高代码的复用性。 从链接方式上,程序库可分为静态库和动态库(共享库)两种: 静态库:是在执行程序运行前就已经加入到执行码中,成为执行程序的一部分来执行。 动态库:是在执行程序启动是加载到执行程序中,可以被多个执行程序共享使用。 一、静态库 1.静态库的概念 静态库是一些目标代码的集合。linux环境下的静态库目标文件一般以.a作为扩展名。Linux环境下使用ar命令创建一个静态库。静态库的优点在于使用简单,编译快速,静态库在应用程序生成时,已经编译成为可重定位的目标文件,因此可不必再编译。 由于静态库在编译时已经复制到可执行代码段中,所以不需要像使用动态库那样在程序加载时再次链接。 2.创建静态库 创建一个四则运算的静态库: (1)四则运算的代码为: /* 计算加法的函数 */ int add(int a, int b) { return a + b; } /* 计算减法的运算 */ int sub(int a, int b) { return a - b; } /*

Tesseract引擎编译

亡梦爱人 提交于 2019-12-01 10:05:52
1. 工具包下载链接   libtiff 4.09 http://download.osgeo.org/libtiff/tiff-4.0.9.zip   leptonica 1.76.0 http://www.leptonica.org/download.html   tesseract 3.5.01 https://github.com/tesseract-ocr/tesseract/archive/3.05.01.zip   CMake 3.16.0 https://cmake.org/download/ 2. 编译流程   工具源码存放处      2.1 tiff          2.1.1 点击 Configure 编译,如果有红色字体出现,则重新Configure一次即可。     2.1.2 点击 Generate ,选择VS对应的版本(本次编译为VS2015)。     2.1.3 打开tiff.sln文件,进入VS工程。 (此处可以选择是Release或者Debug版本)              右击 ALL_BUILD ,点击 生成; 然后右击 INSTALL ,点击 属性 ,将在生成中使用选成 否 。              在下图目录会出现动态库。          2.2 leptonica          2.2.1 点击 Configure

NDK学习三:[转载] android开发 NDK 编译和使用静态库、动态库

假如想象 提交于 2019-12-01 05:06:54
转载: http://hi.baidu.com/joec3/blog/item/687cf98913065dae0e244442.html 特别注意,编译静态库的时候你需要多加一个Application.mk,俺开始没有注意,一直不编译 NDK 编译和使用静态库、动态库 情况一:编译静态库 情况二:编译动态库 情况三:编译动态库+静态库 情况四:已有第三方静态库(动态库),编译静态库(动态库) 默认所有代码和文件在$project/jni下,否则特殊说明。 情况一:编译静态库 文件Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_STATIC_LIBRARY) 文件Application.mk: APP_MODULES :=hello-jni 情况二:编译动态库 文件Android.mk: LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hello-jni LOCAL_SRC_FILES := hello-jni.c include $(BUILD_SHARED_LIBRARY)

Xcode制作动态及静态Framework

好久不见. 提交于 2019-11-30 23:23:14
有没有写SDK或者要将一些常用的工具类做成Framework的经历? 你或许自己写脚本完成了这项工作,相信也有很多的人使用 iOS-Universal-Framework ,随着Xcode 6的发布,相信小伙伴们已经都知道了,Xcode 6支持做Framework了. 同时iOS-Universal-Framework开发者也宣布不在继续维持此项目的开发,建议开发者使用Xcode 6制作,目前网上也有很多制作iOS Framework的资料,但大多都不够详细,接下来本文会详情介绍一下在Xcode 6下制作iOS Framework. 关于静态库和动态库的概念,网上资料很多,这里不做叙述,只讲解制作过程。 创建iOS动态库 新建工程并选择默认Target为Cocoa Touch Framework, 如图: 做编码工作,在这里我简单的写了一个Utils的类,并写了一个log方法 设置开放的头文件:Framework中有些类可能是一些私有的辅助工具,不需要使用者看到,在这里只需要把开放出去的类放到Public下, 如图 这样生成的Framework的Headers目录下也只能看到Public的头文件 编码完成之后,直接Run就能成功生成Framework文件了,选择 xCode->Window->Organizer->Projects->Your Project,

MFC中使用def文件导出动态库的方法

会有一股神秘感。 提交于 2019-11-30 14:39:04
首先创建一个动态库(dll)。 首先是.h文件 int _stdcall add(int a, int b); 因为我们要使用def文件导出动态库,所以这里就不用_declspec(dllexport)来导出了。 .cpp文件 int _stdcall add(int a, int b) { return a + b; } .def文件 LIBRARY "FirstDLL" EXPORTS add 然后我们试试调用这个动态库能不能用。 创建一个MFC的基本对话框,来调用这个动态库。 Dlg.cpp文件: typedef int(_stdcall *ADD)(int a, int b); void CSecondDlg::OnBnClickedButton1() { HINSTANCE mdll = LoadLibrary("..\\Debug\\FirstDLL.dll"); ADD fun; if (mdll != NULL) { fun = (ADD)GetProcAddress(mdll, "add"); if (fun != NULL) { int ret = fun(1, 2); char strRes[100] = { 0 }; sprintf_s(strRes, "和为%d", ret); AfxMessageBox(strRes); } else {

动态库导出类,并调用类函数

﹥>﹥吖頭↗ 提交于 2019-11-30 14:38:54
在对动态库中的类函数的调用,不能直接使用加载函数来调用,否则会出现LINK2019的错误,这里应该用类对象或者类指针来调用类函数。 动态库代码(我这里使用的是WIN32): .h EXTERN_C class CLASSDLL_API Fun { public: int add(int a, int b); }; EXTERN_C CLASSDLL_API int m_add(int a,int b); .cpp int Fun::add(int a, int b) { return a + b; } CLASSDLL_API int m_add(int a,int b) { Fun p; int t = p.add(a, b); return t; } 我们来调用这个类函数,创建一个MFC基本对话框。 Dlg.cpp文件 #pragma comment(lib,"ClassDLL.lib") EXTERN_C int __declspec(dllexport) m_add(int a, int b); void CLoadDLLDlg::OnBnClickedButton1() { int ret = m_add(1, 2); char strRes[100] = { 0 }; sprintf_s(strRes, "和为%d", ret); MessageBoxA(NULL,

写一个简单的动态库并调用

半世苍凉 提交于 2019-11-30 14:38:38
动态库分为静态调用和动态调用。 话不多说,以下来介绍一个简单的动态库的实现及调用。 先写一个动态库,我这里用的是Win32来写的一个简单的动态库。创建时选择DLL,完成之后在.CPP文件中写下函数的实现,然后在.h文件中声明导出文件。生成文件后,会在Debug文件夹下生成.dll文件和.lib文件,这就是我们所要的东西。 .h文件: #ifdef WIN32PROJECT2_EXPORTS #define WIN32PROJECT2_API __declspec(dllexport) #else #define WIN32PROJECT2_API __declspec(dllimport) #endif // 此类是从 Win32Project2.dll 导出的 class WIN32PROJECT2_API CWin32Project2 { public: CWin32Project2(void); // TODO: 在此添加您的方法。 }; extern WIN32PROJECT2_API int nWin32Project2; WIN32PROJECT2_API int fnWin32Project2(void); EXTERN_C WIN32PROJECT2_API int Add(int a, int b); .cpp文件: #include "stdafx.h"