Mac OS开发中常用命令汇总

本文专门针对Mac OS开发中的常用命令行做的汇总,也是本人在做Mac OS开发中经常使用命令。在此记录下,方便以后查找。
首先因为本文是针对命令行的操作,所以首先需要确保你已经安装了Command Line Tools,否则可能会提示”command not found”。
安装Command Line Tools有两种方式,一种是通过Xcode安装,一种是可以访问https://developer.apple.com/downloads/的member center,当然首先你要成为苹果开发者,网站包含了往期的Xcode,Command Line Tools和一些其他开发工具。

查看执行文件或dylib的文件架构(x86_64,i386,ppc)

如果我们在项目中依赖了其他的三方库,在提交苹果商店时,有可能会因为文件类型被拒绝。此处以libmediainfo.dylib作为示例。libmediainfo.dylib是mediainfo的底层实现,可以用于检查多媒体文件信息,但是苹果商店要求app只能是一种文件架构。通过file命令可以查看到libmediainfo.dylib信息如下:
file_command
可以看到libmediainfo.dylib中包含了x86_64,i386,ppc三种类型的架构。

去除不需要的文件架构

现在已经知道了文件的结构,下一步就是去除不需要的文件架构了,现在ppc已经被苹果取消支持了,如果系统中有ppc架构,肯定会被苹果拒绝的,同时x86_64和i386只能存在一种,去除不需要文件架构的命令是lipo命令,详细命令参数可以参照help,这里不详细介绍了,这里只介绍如何去除不需要的架构。具体命令行参数如下:

///<去除i386
lipo source_file -remove i386 -output output_file
///<去除ppc
lipo source_file -remove ppc7400 -output_file

注意,对于ppc,这里去除的是ppc7400。参照如下截图:
lipo_remove

查看执行文件或dylib依赖文件

在windows上,我们采用Dependency Walker来查看dll或exe依赖的相关文件。相对于windows的dll加载策略,不仅在当前执行程序的目录还可以在环境变量目录,系统目录下查找依赖的库文件,Mac OS只会在确定的位置查找依赖库文件。首先看一下如何查看执行文件或dylib依赖的文件。命令行为otool -L,这里以我编译的ffplay作为说明,截图如下:
otool-L
参照截图由于ffplay依赖于SDL,参照截图所示:

/usr/local/lib/libSDL-1.2.0.dylib (compatibility version 12.0.0, current version 12.4.0)

所以如果当你的电脑在/usr/local/lib/目录下没有这个文件时,可执行文件是无法运行的。

修改可执行文件依赖文件路径

在我们编译软件时,可能会运用到一些三方库文件,而三方库文件一般通过configure-make-make install一套操作后都会放到系统目录中,如果我们只发布执行文件而不附加它的依赖文件是无法运行的。这里只针对dylib格式的动态加载文件,对于.a格式的静态文件,由于在编译时已经整合到执行文件中了,所以不会存在这个问题。对于这些三方的dylib文件,例如上一步的libSDL-1.2.0.dylib就需要修改执行文件依赖的dylib目录,最好的方式是放到执行文件的目录下,或者Resource目录下。这里以执行文件的目录作为参考,命令行如下:

install_name_tool -change need_change_lib_path changed_path source_path

这里是我修改ffplay的命令:

install_name_tool -change /usr/local/lib/libSDL-1.2.0.dylib @executable_path/libSDL-1.2.0.dylib /Users/anxs/Desktop/ffplay

此处@executable_path代表当前程序的执行路径,修改后截图如下:
install_name_tool