tinkl
(逆袭者)
2016 年8 月 17 日 07:32
1
前言
开发一些theos功能时,总会用到一些第三方静态库以及动态库,那么这时候就要重新编译并打包,接下来我就尝试和大家分享下我的心得和体会:
目的
在我的工程里加入Leancloud (leancloud.cn )SDK 集成到“脉脉(基于工作的社交app)”插件里。
教程
1 下载Leancloud SDK到工程里下,现在需要自己用leancloud源码手工编译不同版本的静态库 如图:
用lipo -detailed_info AVOSCloud.framework/AVOSCloud
命令查看静态库的架构支持,主要用于真机测试
2 查看AVOSCloud.framework 目录下所有文件
**注意:** 这里只有两处我们需要用到 二进制文件“AVOSCloud” 和 头文件夹 “Headers” 其它文件处于签名和plist 和 modules基本没用处 在编写makefile时可以忽略
3 编写makefile文件
# 编译架构设置
ARCHS = armv7 arm64
*MMTools* 为插件名称
#Take off the `lib` and the `.dylib` and put that after `-l`.
MMTools_LDFLAGS += -lz.1 -lstdc++ -lxml2 -lz -licucore -lsqlite3 -lc++
#这里是系统library引入 注意写法 如 libz.1.dylib 为 -lz.1
# leancloud sdk 二进制引入
MMTools_LDFLAGS += AVOSCloud.framework/AVOSCloud
4 make 测试效果
==> Compiling AppTweak.xm (armv7)…
==> Preprocessing AppTweak.xm…
==> Compiling AppTweak.xm (arm64)…
make 通过
5 AppTweak.xm代码引入
在根目录下创建目录TKGameCenter
注意:LeancloudHeaders是我从Leancloud.framework里拷贝里面的文件夹Headers到这里。
在同目录下TKGameCenter.m代码里直接使用#import "LeanCloudHeaders/AVOSCloud.h"引入即可编译成功,我目前在TKGameCenter.m里做初始化处理 如图:
然后在AppTweak.xm里文件里使用 如图:
$ cat AppTweak.xm
#import "TKGameCenter/TKGameCenter.h"
%hook xxxxx
.......
TKGameCenter * tc = [TKGameCenter sharedInstance];
[tc initWithLeanCloud];
结束
以上基本动态库和静态库都是这样操作,如果是.a文件,直接XXX_LDFLAGS += xxx.a即可
5 个赞
Zhang
2016 年8 月 17 日 07:34
2
还可以加个-force_load
例如-force_load AVOSCloud.framework/AVOSCloud
tinkl
(逆袭者)
2016 年8 月 17 日 07:35
3
####编译器 ----------------------------------------------------------
MMTools_LDFLAGS += -std=gnu99
MMTools_LDFLAGS += -all_load -licucore
编译器选项没写上去。
Mokle
(Mokle)
2016 年10 月 28 日 07:09
4
@tinkl 按照您的方法嵌入BmobSDK报错
mokledeMacBook-Air:tweak mokle$ make
Making all for tweak tweak…
Linking tweak tweak…
Undefined symbols for architecture armv7:
“OBJC_CLASS $_PHAssetResource”, referenced from:
objc-class-ref in BmobSDK
“OBJC_CLASS $_PHAssetResourceManager”, referenced from:
objc-class-ref in BmobSDK
ld: symbol(s) not found for architecture armv7
tinkl
(逆袭者)
2016 年10 月 28 日 07:18
5
Mokle:
PHAssetResource
PHAssetResource 看错误提示。
头文件和引入一切路径要正确
Mokle
(Mokle)
2016 年10 月 28 日 07:40
6
我是直接放在tweak目录下面的 按你的方法 第3 4步方法 结果make报这个错了
Mokle
(Mokle)
2016 年10 月 28 日 08:55
7
@tinkl 葫芦画瓢照您方法 嵌入learnCloud 的SDK也报错了
Linking tweak tweak…
duplicate symbol _llvm.cmdline in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVRequestOperation.o)
duplicate symbol _llvm.embedded.module in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVRequestOperation.o)
duplicate symbol _llvm.cmdline in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVJSONRequestOperation.o)
duplicate symbol llvm.embedded.module in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVJSONRequestOperation.o)
ld: 182 duplicate symbols for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [obj/tweak.dylib.ba964c90.unsigned] Error 1
make[1]: *** [internal-library-all ] Error 2
make: *** [tweak.all.tweak.variables] Error 2
mokledeMacBook-Air:tweak mokle$
mokledeMacBook-Air:tweak mokle$
mokledeMacBook-Air:tweak mokle$
mokledeMacBook-Air:tweak mokle$
mokledeMacBook-Air:tweak mokle$
mokledeMacBook-Air:tweak mokle$ make
Making all for tweak tweak…
Linking tweak tweak…
duplicate symbol _llvm.cmdline in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVRequestOperation.o)
duplicate symbol _llvm.embedded.module in:
AVOSCloud.framework/AVOSCloud(AVFile.o)
AVOSCloud.framework/AVOSCloud(AVRequestOperation.o)
ld: 182 duplicate symbols for architecture armv7
Zhang
2016 年10 月 30 日 15:02
8
步骤没问题。库本身有问题。
库的target和tweak不一样可能
Mokle
(Mokle)
2016 年10 月 31 日 04:19
10
张总 貌似可以了 把framework分解架构后 然后把makefile重新配置了下 编译done了。。
特此感谢@tinkl 又涨姿势了
2 个赞
tinkl
(逆袭者)
2016 年11 月 3 日 07:58
11
应该是他配置和引用路径出的问题,配置完成过其实是没问题了。
framework就当做一个特殊的文件夹,真正有用的还是里面的二进制文件和头文件以及资源文件
Zhang
2016 年11 月 3 日 13:58
12
linker层也有乱七八糟的bullshit
之前踩过坑。
您好 我最近在尝试 把自己写的 静态库 依附到其他app上去 用来测试公司静态库,因为 您写的这片文章但是 过程不是很明白 能否 加一下 我的qq 969175397 或者 我加您一下 qq
AVOSCloud” 和 头文件夹 “Headers” 文件夹是存放在 tweak工程同一个目录下
在根目录下创建目录TKGameCenter 是单独创建 .h 和.m 文件么?
tinkl
(逆袭者)
2017 年2 月 22 日 14:30
17
TKGameCenter这个目录创建时根目录,作用就是为了区分*.xm代码和用于开发第三方SDK静态库的代码,Leancloud主要用于存储,TKGameCenter.m里更多的是对leancloud核心类的封装方便在*.xm文件里调用,因为你在*.xm直接调用leancloud的类不方便调试和测试。你的问题更多的是编译文件路径问题和引入问题:至于对TKGameCenter.m文件的编译射和设置,我在makefile里这样设置:
` #编译 ----------------------------ThirdPart--------------------
GameCenter
WeChatGroupTools_FILES += TKGameCenter/TKGameCenter.m
WeChatGroupTools_FILES += TKGameCenter/TKSettingVC.mm
#WeChatGroupTools_FILES += RealmDB/RealmDB.m`
希望可以给你参考和帮助
1 个赞
sunShuShu
(Sun Shu Shu)
2017 年3 月 30 日 08:26
19
我注入微信,往微信里添加了两个framework,能编译过,但是每次微信一启动就打印日志:
dlopen(/Library/MobileSubstrate/DynamicLibraries/Telescope.dylib, 9): Library not loaded: @rpath /xxx.framework/xxx
Referenced from: /Library/MobileSubstrate/DynamicLibraries/Telescope.dylib
Reason: image not found
试过了添加xxx_LDFLAGS, -std=gnu99 -all_load -licucore -force_load 能给点建议吗?
sunShuShu
(Sun Shu Shu)
2017 年3 月 31 日 01:11
20
搞定了,在这记录一下吧
framework打包成静态库就好了,怪不得这报错看起来很像工程没有embed frameworks