如何在Theos工程里嵌入第三方SDK或者静态库

前言

开发一些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 个赞

还可以加个-force_load
例如-force_load AVOSCloud.framework/AVOSCloud

####编译器 ----------------------------------------------------------
MMTools_LDFLAGS += -std=gnu99
MMTools_LDFLAGS += -all_load -licucore
编译器选项没写上去。

@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

PHAssetResource 看错误提示。
头文件和引入一切路径要正确

我是直接放在tweak目录下面的 按你的方法 第3 4步方法 结果make报这个错了

@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

步骤没问题。库本身有问题。
库的target和tweak不一样可能

悲惨的菜鸟,满世界的坑坑。。。

张总 貌似可以了 把framework分解架构后 然后把makefile重新配置了下 编译done了。。

特此感谢@tinkl 又涨姿势了

2 个赞

应该是他配置和引用路径出的问题,配置完成过其实是没问题了。

framework就当做一个特殊的文件夹,真正有用的还是里面的二进制文件和头文件以及资源文件

linker层也有乱七八糟的bullshit
之前踩过坑。

张总说得不对。

您好 我最近在尝试 把自己写的 静态库 依附到其他app上去 用来测试公司静态库,因为 您写的这片文章但是 过程不是很明白 能否 加一下 我的qq 969175397 或者 我加您一下 qq

AVOSCloud” 和 头文件夹 “Headers” 文件夹是存放在 tweak工程同一个目录下

在根目录下创建目录TKGameCenter 是单独创建 .h 和.m 文件么?

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 个赞

嗯嗯 谢谢你的回复哦 :grinning:

我注入微信,往微信里添加了两个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 能给点建议吗?

搞定了,在这记录一下吧
framework打包成静态库就好了,怪不得这报错看起来很像工程没有embed frameworks

招聘麻烦单独发