macOS平台下Framework开发过程中经常需要用到各种工具,下面做个总结以防遗忘。每个工具命令只举几个例子,详细使用帮助可以通过man查询。
xcodebuild
build Xcode projects and workspaces
这个工具可以用来编译xcode工程:
xcodebuild -project MyFramework.xcodeproj -scheme MyFramework -configuration Release CONFIGURATION_BUILD_DIR='~/Desktop/build/arm'
xcrun
Run or locate development tools and properties.
通常用xcrun来生成ipa包:
xcrun -sdk iphoneos -v PackageApplication ./build/Release-iphoneos/Toyun.app -o ~/Desktop/Toyun.ipa
libtool
create libraries
创建库。mac平台下的Framework依赖另外一个Framework,编译后默认是不会合并成一个的,如果想要给出一个Framework可以使用这个工具。
合并两个静态库:
libtool -static -o c a.framework/a b.framework/b
ar
create and maintain library archives
这个命令用于创建和管理归档(archive)文件。主要应用是解决第三方库冲突,例如ffmpeg冲突就可以用ar分离出冲突文件,并打包。
将.o从.a静态库中删除:
ar -d lib.a conflict.o
将.a文件解压缩:
ar -x lib.a
lipo
create or operate on universal files
lipo主要用于处理通用二进制文件。
查看架构信息:
lipo -info a.framework/a
合并生成一个胖包:
lipo -create Debug-iphoneos/a.framework/a Debug-simulators/a.framework/a -output aout
分离出armv7版本库:
lipo a.framework/a -thin armv7 -output aout
nm
display name list (symbol table)
展示符号信息:
nm -nm a.out
otool
object file displaying tool
比nm更强大,可以详细查看mach-o文件信息。mac还有一个对应的图形化工具——MachOView。
查看依赖动态库:
otool -L a.out
查看反汇编代码段:
otool -v -t a.out
objdump
display information from object files
反汇编目标文件或可执行文件。
反汇编a.out所有header信息:
objdump -x a.out
反汇编a.out所有section信息:
objdump -D a.out
intstall_name_tool
change dynamic shared library install names
这个工具用的比较少,它可以修改动态库的找寻路径。
例如cmake生成的动态库添加到工程可能存在dyld: Library not loaded 的错误,这个时候,我们先用 otool 查看一下这个动态库的路径:
otool -L a.framework/a
得到结果:
/Users/worthy/Desktop/a.framework/a (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 307.5.0)
/usr/lib/libSystem.dylib (compatibility version 1.0.0, current version 1238.50.2)
注意上面的动态库路径是个绝对路径,动态链接器加载的时候肯定找不到动态库,我们需要用@RPATH的相对路径,需要使用install_name_tool修改:
install_name_tool -id @rpath/a.framework/a a.framework/a
网友评论