问题描述
问题描述:
我有一个Xcode工作区,它引用了两个Xcode项目。第一个Xcode项目(lib.xcodeproj
)构建一个iOS静态库,而第二个项目(app.xcodeproj
)构建一个使用该静态库的iOS应用。 app.xcodeproj
个引用lib.xcodeproj
,即lib.xcodeproj
的链接二进制文件和库构建阶段中列出了app.xcodeproj
。
因此,设置如下:
MyApp.xcworkspace
|
+-app.xcodeproj---+
| | Referenced via build phase
+-lib.xcodeproj <-+
如果我在Xcode中打开此工作区并从中建立归档文件(Product
->
Archive
),则所有内容都会按预期编译,最后我得到.xcarchive
。如果我通过命令行(xcodebuild archive -workspace MyApp.xcworkspace ...
)进行构建,则同样适用。
但是,转储作为存档一部分生成的dSYM文件的内容表明,该文件不包含静态库(lib.xcodeproj
)的调试符号。更具体地说,执行命令
dwarfdump MyApp.xcarchive\dSYMs\MyApp.app.dSYM\Contents\Resources\DWARF\MyApp > dwarfdump.txt
生成一个文本文件,该文本文件确认应用程序本身的所有调试符号都在其中,而静态库的调试符号不存在。
这仅在创建档案时发生。通过Product
菜单->
Build
生成一个生成的dSYM文件,其中包含应用程序的所有调试符号和静态库。
现在,这并不是完全新的。该行为早在很久以前就已经观察到,我发现三个描述相同行为的不同SO帖子(here,here和here)。但是,这些帖子已经超过7年了!
我想知道的事情:
其他人如何创建使用在同一工作区中创建的静态库的应用程序存档?
分析(对于好奇的读者):
我已经分析了这个问题,并强烈怀疑这是一个持久的Xcode问题。这是我发现的:
通过xcodebuild build -workspace MyApp.xcworkspace ...
构建工作区会产生以下日志条目序列:
CompileC <static library file 1>
CompileC <static library file 2>
...
Libtool <instructions to create the static library>
...
CompileC <app file 1>
CompileC <app file 2>
...
GenerateDSYMFile <instructions to create the dSYM file>
...
CodeSign <instructions to sign the app>
通过xcodebuild archive -workspace MyApp.xcworkspace ...
构建工作区会产生以下日志条目序列:
CompileC <static library file 1>
CompileC <static library file 2>
...
Libtool <instructions to create the static library>
Strip <instructions to strip the debugging symbols from the static library>
...
CompileC <app file 1>
CompileC <app file 2>
...
GenerateDSYMFile <instructions to create the dSYM file>
Strip <instructions to strip the debugging symbols from the app>
...
CodeSign <instructions to sign the app>
从这两个序列中我们可以看到,在创建存档时,我们会调用strip
工具。该工具从二进制文件中删除调试符号。因此,当创建dSYM文件时,静态库根本不再包含任何调试符号。
执行GenerateDSYMFile
时,剩下的只是应用程序内的调试符号。这些符号然后也被剥离。但是在dSYM文件已经存在之后而不是在静态库中那样删除它们。
现在,有一些旨在影响该行为的构建设置。我发现以下内容并测试了它们是否有效果:
-
Strip Debug Symbols During copy
(copY_PHASE_STRIP
):没什么区别,顺序不变 -
Strip Linked Product
(STRIP_INSTALLED_PRODUCT
):没什么区别,顺序不变 -
Strip Style
(STRIP_STYLE
):更改传递到strip
工具的参数。但是我仍然不能阻止信息剥离。
因此,凭借这些信息,我敢于声明Xcode对该星座使用的构建过程完全不正确。正确的方法是运行GenerateDSYMFile
,然后在静态库和应用程序运行strip
之后运行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)