- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章xcode 详解创建静态库和动态库的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
xcode 创建静态库和动态库 。
1、linux中静态库和动态库区别
库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库和动态库两种.
静态库:这类库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译.
动态库:这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便.
2、ios开发中静态库和动态库区别
静态库和动态库是相对编译期和运行期的:静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要改静态库;而动态库在程序编译时并不会被链接到目标代码中,只是在程序运行时才被载入,因为在程序运行期间还需要动态库的存在.
静态库 好处:
i.模块化,分工合作,提高了代码的复用及核心技术的保密程度 。
ii.避免少量改动经常导致大量的重复编译连接 。
iii.也可以重用,注意不是共享使用 。
动态库 好处:
i.使用动态库,可以将最终可执行文件体积缩小,将整个应用程序分模块,团队合作,进行分工,影响比较小 。
ii.使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 。
iii.使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的.
iv.应用插件化 。
v.软件版本实时模块升级 。
vi.共享可执行文件 在其它大部分平台上,动态库都可以用于不同应用间共享,这就大大节省了内存。从目前来看,ios仍然不允许进程间共享动态库,即ios上的动态库只能是私有的,因为我们仍然不能将动态库文件放置在除了自身沙盒以外的其它任何地方。 不过ios8上开放了app extension功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的.
3、xcode创建静态库 。
打开xcode, 选择file ----> new ---> project。 新建工程。 选择ios ----> framework & library ---> cocoa touch static library。 点击next。创建工程: 。
新增2个类作为我们的一个静态类文件: 。
其中loglib.h的代码如下:(作为公开存在) 。
loglib.m实现方法如下,变成静态库后该文件隐藏: 。
然后选择真机进行静态库的创建:(command + b) 。
这个时候会出现如下的错误提示: 。
按照错误的提示得知我们需要在ios8.1下build需要选择证书: 。
好了,在product下会存在libstaticlib.a文件: 。
这只是真机下的一个静态库,同样选择模拟器,command + b,生成模拟器下的静态库.
找到这2个新建的静态库文件: 。
分别用2个.a加入到其他项目在不同运行坏境选择不同的.a静态库明显不明智,打开终端,输入以下命令行进行整合:
lipo -create 真机.a路径 模拟器.a路径 -output 整合的.a路径 。
1
2
3
4
5
|
lipo -create /users/fangdd/library/developer/
xcode/deriveddata/staticlib-ercfdooewtvlxmakqvyxkohcagph
/build/products/debug-iphoneos/libstaticlib.a /users/fangdd
/library/developer/xcode/deriveddata/staticlib-ercfdooewtvlxmakqvyxkohcagph
/build/products/debug-iphonesimulator/libstaticlib.a -output /users/fangdd/desktop/staticlib.a
|
会在 整合的.a路径下找到合体的静态库.
将生产的静态库及相应的头文件加入到我们的测试项目中,运行得到: 。
完毕. 。
4、xcode创建动态库 。
打开xcode, 选择file ----> new ---> project。 新建工程。 选择ios ----> framework & library ---> cocoa touch framework。 点击next。创建工程: 。
命名为dymiclib: 。
同样的添加新的2个类作为测试: 。
将头文件作为公共的头文件,提供给外部调用: 。
运行后变生成了一个动态库,找到product下的dymiclib.framework所在的目录: 。
注意这个只是运行坏境下的动态库(模拟器和真机),下面建立新的targets:命名为commondymiclib: 。
将之前生成的dymiclib加入到新的commondymiclib中: 。
为commondymiclib添加新的脚本来实现模拟器和真机合并: 。
脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
# sets the target folders and the final framework product.
fmk_name=${project_name}
# install dir will be the final output to the framework.
# the following line create it in the root folder of the current project.
install_dir=${srcroot}/products/${fmk_name}.framework
# working dir will be deleted after the framework creation.
wrk_dir=build
device_dir=${wrk_dir}/release-iphoneos/$ {fmk_name}.framework
simulator_dir=${wrk_dir}/release-iphonesimulator/${fmk_name}.framework
# -configuration ${configuration}
# clean and building both architectures.
# 分别编译生成真机和模拟器使用的framework
xcodebuild -configuration
"release"
-target
"${fmk_name}"
-sdk iphoneos clean build
xcodebuild -configuration
"release"
-target
"${fmk_name}"
-sdk iphonesimulator clean build
# cleaning the oldest.
if
[ -d
"${install_dir}"
]
then
rm -rf
"${install_dir}"
fi
mkdir -p
"${install_dir}"
cp -r
"${device_dir}/"
"${install_dir}/"
# uses the lipo tool to merge both binary files (i386 + armv6/armv7) into one universal final product.
# 使用lipo命令将其合并成一个通用framework
# 最后将生成的通用framework放置在工程根目录下新建的products目录下
lipo -create
"${device_dir}/${fmk_name}"
"${simulator_dir}/${fmk_name}"
-output
"${install_dir}/${fmk_name}"
rm -r
"${wrk_dir}"
|
。
选择ios device运行: 。
找到生成的commondymiclib下的动态库dymiclib.framework: 。
在测试项目中将dymiclib.framework加入: 。
运行即可! 。
心得:这个时候所谓的动态库其实意义就是升级版的静态库,因为动态库使用的前提是项目在发布前添加到项目中,这和我们所谓的插件(即插即用,随时在自己的服务器上下载一个动态库运行,而不需要重新打包,我们可以选择在需要的时候再加载动态库)完全是两码事.
插件实现方式:使用dlopen加载动态库,动态库中真正的可执行代码为dymiclib.framework/dymiclib文件,因此使用dlopen时如果仅仅指定加载动态库的路径为dymiclib.framework是没法成功加载的。将我们创建的动态库放在我们的服务器,项目上线后再下载这个动态库到我们的documents文件夹中,使用如下代码动态使用动态库:
1
2
3
4
5
6
7
8
9
10
11
|
#import <dlfcn.h>
nsstring *documentspath = [nsstring stringwithformat:@
"%@/documents/dymiclib.framework/dymiclib"
,nshomedirectory()];
voidvoid * libhandle = null;
libhandle = dlopen([documentspath cstringusingencoding:nsutf8stringencoding], rtld_now);
if
(libhandle == null) {
charchar *error = dlerror();
nslog(@
"dlopen error: %s"
, error);
}
else
{
nslog(@
"dlopen load framework success."
);
}
|
使用 动态库 中的类:
1
2
3
4
5
|
class
rootclass = nsclassfromstring(@
"dymiclog"
);
if
(rootclass) {
id object = [[rootclass alloc] init];
[(dymiclog *)object relog:@
"hello world"
];
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于xcode 详解创建静态库和动态库的方法的文章就讲到这里了,如果你想了解更多关于xcode 详解创建静态库和动态库的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!