ios动态库,IOS可以使用动态库文件么

1,IOS可以使用动态库文件么不一定需要 。创建一个库一般处于一下两种目的: 1、把一些相关的代码,打包成一个库,发布给其它的人用 。这中情况是最常见的情况,如写 c 语言用到 libgcc 。在这种情况下,你除了提供库文件:静态库[ windows 下 .lib,linux .a];
2,ios 动态库创建后在哪个目录不一定需要 。创建一个库一般处于一下两种目的: 1、把一些相关的代码,打包成一个库,发布给其它的人用 。这中情况是最常见的情况,如写 C 语言用到 libgcc 。在这种情况下,你除了提供库文件:静态库[ windows 下 .lib , linux .a];任务占坑
3,IOS上可以发布动态库或服务吗哦?脚本类型是?我看有提到后台运行的应用的,不可以提供后台供其他应用调用?哦?脚本类型是?我看有提到后台运行的应用的 , 不可以提供后台供其他应用调用?问题貌似解决了,还没有做完整的实验:利用“APP之间可以通过定制URL通讯模式”可以通讯,其中一个应用就实现了提供服务,另一个应用来调用 。http://hi.baidu.com/%D0%A1%B7%EF%EC%E3%EC%E3/blog/item/d5b12945039c700442a75bf8.html明天做个完整的实验 , 谢谢各位大侠帮忙 , 做完实验再把问题置为解决 。网上有APP在IOS后台运行的介绍: http://blog.sina.com.cn/s/blog_62f6e54a0100ryqw.html还没有试验 。【ios动态库,IOS可以使用动态库文件么】
4 , iOS静态库和动态库的区别 升级版静态库:这类库的名字一般是libxxx.a,xxx为库的名字 。利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持 , 因为所有使用的函数都已经被编译进去了 。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译 。动态库:这类库的名字一般是libxxx.M.N.so,同样的xxx为库的名字,M是库的主版本号,N是库的副版本号 。当然也可以不要版本号,但名字必须有 。相对于静态函数库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数 , 因此动态函数库所产生的可执行文件比较小 。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库 。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便 。linux系统有几个重要的目录存放相应的函数库 , 如/lib /usr/lib 。当要使用静态的程序库时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的 , 所以一旦连接成功,静态程序库也就不再需要了 。两者区别: 一,静态库的使用需要: 1 包含一个对应的头文件告知编译器lib文件里面的具体内容 2 设置lib文件允许编译器去查找已经编译好的二进制代码 二,动态库的使用: 程序运行时需要加载动态库,对动态库有依赖性,需要手动加入动态库 三,依赖性: 静态链接表示静态性 , 在编译链接之后, lib库中需要的资源已经在可执行程序中了,也就是静态存在,没有依赖性了 动态 , 就是实时性,在运行的时候载入需要的资源,那么必须在运行的时候提供 需要的 动态库,有依赖性 ,  运行时候没有找到库就不能运行了 四,区别: 简单讲,静态库就是直接将需要的代码连接进可执行程序;动态库就是在需要调用其中的函数时 , 根据函数映射表找到该函数然后调入堆栈执行 。做成静态库可执行文件本身比较大,但不必附带动态库 做成动态库可执行文件本身比较小,但需要附带动态库 五: 首先纠正所谓“静态连接就是把需要的库函数放进你的exe之中”的说法 。在真实世界中,有三个概念:usestaticlibary,staticlinkeddll,dynamiclinkeddll. 多数人混淆了staticlibary和staticlinkeddll的概念,当然他们有似是而非的“相似之处”,比如都用到.lib,下面具体说明 。使用静态库(usestaticlibary)是把.lib和其他.obj一起build在目标文件中,目标文件可以是.exe,也可以是.dll或.oxc等 。一般情况下 , 可以根本就没有“对应的”.dll文件,如cruntime(crt)库 。一个例子就是,写一个main(){},build出来并不是只有几个字节 , 当然有人会说那还有exe文件头呢?是,即使加上文件头的尺寸 , build出的执行文件仍然“莫名的大” 。实际上那多出来的部分就是crt静态库 。姑且可以把静态库.lib理解成外部程序的obj文件比较合理,它包含了函数的实现 。5,ios 本地工程加载自定义动态库时需要对动态库进行签名吗.a静态库不能进行反编译,反汇编的可能性也极低 。静态库:静态库仅在程序启动时被连接使用,程序运行时iOS 静态库不需要签名DLL文件(Dynamic Linkable Library 即动态链接库文件) , 是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作 。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用 。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大?。?它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间 , 造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试 。Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件 , 并可对它们单独编译和测试 。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中 。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用 。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现 。一般来说 , DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL 。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分 。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上 。DLL 模块中包含各种导出函数,用于向外界提供服务 。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关 。在 Win32 环境中,每个进程都复制了自己的读/写全局变量 。如果想要与其它进程共享内存 , 必须使用内存映射文件或者声明一个共享数据段 。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的 。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配 。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去 。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有 。调用方式:1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL , 则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求 。隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下 。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary() 。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件 。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码 。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中 。当程序员通过静态链接方式编译生成应用程序时 , 应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中 。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名) , 链接程序将其存储在 EXE 文件内部 。当应用程序运行过程中需要加载 DLL 文件时,Windows 根据这些信息发现并加载 DLL , 然后通过符号名或标识号实现对 DLL 函数的动态链接 。所有被应用程序调用的 DLL 文件都会在应用程序 EXE 文件加载时被加载在到内存中 。可执行程序链接到一个包含 DLL 输出函数信息的输入库文件(.LIB文件) 。操作系统在加载使用可执行程序时加载 DLL 。可执行程序直接通过函数名调用 DLL 的输出函数,调用方法和程序内部其 它的函数是一样的 。2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的 , 使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式 。显式的调用:是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数 , 再用 GetProcAddress() 获取想要引入的函数 。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了 。在应用程序退出之前 , 应该用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动态连接库 。直接调用 Win32 的 LoadLibary 函数,并指定 DLL 的路径作为参数 。LoadLibary 返回 HINSTANCE 参数,应用程序在调用 GetProcAddress 函数时使用这一参数 。GetProcAddress 函数将符号名或标识号转换为 DLL 内部的地址 。程序员可以决定 DLL 文件何时加载或不加载,显式链接在运行时决定加载哪个 DLL 文件 。使用 DLL 的程序在使用之前必须加载(LoadLibrary)加载DLL从而得到一个DLL模块的句柄,然后调用 GetProcAddress 函数得到输出函数的指针,在退出之前必须卸载DLL(FreeLibrary) 。正因为DLL 有占用内存?。帽嗉鹊奶氐阌泻芏嗟缒圆《径际荄LL格式文件 。但不能单独运行 。动态链接库通常都不能直接运行 , 也不能接收消息 。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数 。只有在其它模块调用动态链接库中的函数时,它才发挥作用 。dll和内存管理在Win32中,DLL文件按照片段(sections)进行组织 。每个片段有它自己的属性 , 如可写或是只读、可执行(代码)或者不可执行(数据)等等 。DLL代码段通常被使用这个DLL的进程所共享;也就是说它们在物理内存中占据一个地方,并且不会出现在页面文件中 。如果代码段所占据的物理内存被收回,它的内容就会被放弃 , 后面如果需要的话就直接从DLL文件重新加载 。与代码段不同,DLL的数据段通常是私有的;也就是说,每个使用DLL的进程都有自己的DLL数据副本 。作为选择,数据段可以设置为共享,允许通过这个共享内存区域进行进程间通信 。但是 , 因为用户权限不能应用到这个共享DLL内存,这将产生一个安全漏洞;也就是一个进程能够破坏共享数据,这将导致其它的共享进程异常 。例如 , 一个使用访客账号的进程将可能通过这种方式破坏其它运行在特权账号的进程 。这是在DLL中避免使用共享片段的一个重要原因 。当DLL被如UPX这样一个可执行的packer压缩时,它的所有代码段都标记为可以读写并且是非共享的 。可以读写的代码段,类似于私有数据段,是每个进程私有的并且被页面文件备份 。这样 , 压缩DLL将同时增加内存和磁盘空间消耗,所以共享DLL应当避免使用压缩DLL 。[1][2][3]找到DLL文件地址:C:\WINDOWS\system32\****.dll时出错(****就是你的那个找不到的文件名)开始--运行--msconfig--启动--找到和你说的类似的选项****--取消勾--确定 , 然后1 , 开始-运行-输入:regedit , 然后回车2,选择“我的电脑”,然后点击“文件”-“导出”-随便起个名字点“保存” 。这样做的目的是备份一下注册表,以免误操作后及时恢复 。恢复的方法是,找到你刚才保存的文件,双击它,然后选择“允许导入”即可 。3,选择“我的电脑” , 按F3键,然后输入“****”,点击“查找下一个”,找到后一定要核对是不是****.dll文件,因为你给的文件名不全 , 如果确认,对该项点“右键”选“删除” 。“此时可以输入****.dll进行查找,结果出来后要看后面的数值部分,不能光看文件名称,只要有****.dll在的文件不管它边上还写没写别的(如:****.dll , load),都要删除!”4 , 然后再按F3键-删除,直到提示“没有找到相应选项”为止 。5,重新启动计算机 , 看看系统有没有问题 。注,如果出现了其它严重问题,请恢复注册表 。

    推荐阅读