基于iOS 8 SDK链接和金属框架构建的静态库

基于iOS 8 SDK链接和金属框架构建的静态库,ios,xcode,Ios,Xcode,在构建我使用iOS 8 SDK编写的静态库时,生成的库与金属框架链接: $ otool -arch all -fl <static library> ... Load command 12 519 cmd LC_LINKER_OPTION 520 cmdsize 32 521 count 2 522 string #1 -framework 523 string #2 Metal ... $otool-arch all-fl ... 加载命令1

在构建我使用iOS 8 SDK编写的静态库时,生成的库与金属框架链接:

$ otool -arch all -fl <static library>

...
Load command 12
 519      cmd LC_LINKER_OPTION
 520  cmdsize 32
 521    count 2
 522   string #1 -framework
 523   string #2 Metal
...
$otool-arch all-fl
...
加载命令12
519 cmd LC_链接器_选项
520尺寸32
521第2点
522字符串#1-框架
523串#2金属
...
我认为这是通过UIKit实现的;我没有直接链接到它,而“链接到标准库”是否定的。这会导致iOS 7的Xcode 5.1.1出现问题,因为这个框架不存在。使用Xcode 5构建静态库与metal没有关联,但我更愿意使用最新的Xcode产品版本构建静态库,在某个时候我必须解决这个问题。如何使用Xcode 6构建并解决Xcode 5用户的这个问题

另一位开发人员也看到了这个问题,他只是使用了他所需要的特定框架,这些框架没有与Metal链接,但我不能这样做,因为我需要与UIKit链接:
这里是card.io的Dave。即上述“另一个开发者”

我们的解决方案应该适用于您,它是在构建静态库时设置为
NO
两个构建设置:
CLANG\u ENABLE\u MODULES
CLANG\u MODULES\u AUTOLINK
(也称为
ENABLE MODULES(C和Objective-C)
自动链接框架

在禁用这些模块设置的情况下构建库将完全消除
LC\u LINKER\u选项
命令


使用库的应用程序可以启用或不启用这些模块设置。应用程序(而不是你的库)必须包括
UIKit.framework
等,可以通过模块自动,也可以作为“链接库”手动。那么这是如何工作的呢?静态库只是一堆不包含链接指令的对象文件。这是ios8中的新功能吗?我自己也不太确定,但我相信对象文件指定了需要使用load命令链接的框架。这就是-l选项,它显示对象的加载命令。您能告诉我您是如何将
-framework Metal
LC\u LINKER\u选项引入静态库的吗?我询问的原因是,如果您可以编辑它,您可以将
-framework
更改为
-weak\u framework
,这可能会解决您的问题。然而,通过阅读您引用的线程,
LC\u LINKER\u选项
应该只是为了解决一个未定义的符号,这听起来像是弱链接。谢谢Dave,我错过了作为您的解决方案,我以为你只是使用了你需要的依赖框架,而不是一个伞式框架,其中也包括金属。也许我也应该直呼你的名字;)干杯很高兴我能帮上忙@在构建过程中,您在哪里设置这些标志(除了在Xcode构建设置中手动设置之外)?当我试图在podspec中将它们传递给编译器时(
s.compiler\u flags='-CLANG\u ENABLE\u MODULES=NO','-CLANG\u MODULES\u AUTOLINK=NO'
),它们无法识别。@kraftydevil我是在Xcode中手动设置它们的。如果您检查Xcode帮助面板,您将看到它们对应于省略
-fmodules
-fmodules autolink
标志。我不确定podspec是否可以指定省略标志。@kraftydevil如下,
s.pod\u target\u xcconfig={'DEFINES\u MODULE'=>'YES','CLANG\u MODULES\u AUTOLINK'=>'YES'}