Xcode自定义构buildconfiguration导致静态库的“库/文件未find”

我有一个工程与一个项目链接在另一个项目(这也是在工作区中)的静态库。 这是Kobold2D中的一个问题,即使我理解了原因,我仍然无法解决,我想这与这个问题很相似 。

项目目标和静态库目标都具有debugging发布版本configuration。 一切都很好。

现在有人在项目中添加了新的构buildconfiguration,并将其命名为Ad-Hoc 。 现在项目的目标是build立Ad-Hocconfiguration,但是静态库没有这样的configuration。 显然他们默认构buildReleaseconfiguration。

最后,当链接器应该把所有东西放在一起时,它就会失败:

ld: library not found for -lbox2d-ios Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1 

对于强制加载的库通过-force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a错误是类似的,但说“找不到文件”。 我应该注意到库“libbox2d-ios.a”在“链接二进制库”构build阶段列表中。

很明显,问题在于链接器假定这些库在BUILT_PRODUCTS_DIRAd-Hoc-iphoneos文件夹中,而它们实际上在Release-iphoneos文件夹中,因为它们没有Ad-Hoc构buildconfiguration。

我怎样才能把连接器打在脸上,告诉他把图书馆放在哪里? 最好我正在寻找一个适用于这两种情况的解决scheme,即库添加了标准方式(链接二进制与库构build阶段)和需要额外的-force_load工作的库。

我希望有一些方法可以:

  • 强制库被放置在应用程序目标的构buildconfiguration文件夹中
  • 运行后编译和预链接脚本,将每个库复制到构buildconfiguration文件夹
  • 指定库的相对path
  • 对于-force_load,使用$ BUILT_PRODUCTS_DIR以外的其他macros
  • 像-WTFmake-all-problems-go-away这样的链接器标志

对不起,我不得不说这个… 唉! 🙂

不幸的是,我还没有find办法做到这一点。 我能find的最好的解决方法是添加新的目标而不是新的构buildconfiguration。 所以例如在我的一个项目中,我只有Release和Debugconfiguration,但是我有额外的目标叫做“MyProject – app store”和“MyProject – ad hoc”。 这当然只有当你控制了项目文件的时候才有可能。

有重复的目标坐在一起是非常恼人的,因为你可以添加文件到一个目标,并忘记将它们添加到其他人,你不会知道,直到你试图build立它。 但它确实build立,这是一个胜利(无论如何xcode)。

我刚才问的一个类似的问题: 在ios项目中使用静态库在xcode 4中创build归档文件来设置构buildconfiguration的正确方法是什么?

正如在类似的问题中说的iOS静态库作为一个项目的自定义生成configuration的子项目? ,修正是添加这一行

$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

到您的目标的Framework Search PathsHeader Search Paths和/或Library Search Paths

这是对我有用的东西。

在使用Adhoc构buildconfiguration的项目中,替代Adhoc构buildconfiguration的“每configuration构build产品path”(CONFIGURATION_BUILD_DIR)和“每configuration中间构build文件path”(CONFIGURATION_TEMP_DIR),以使用与发布configuration相同的文件夹。

 Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME) Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME) 

现在当你做一个Adhoc构build时,Xcode会将libFoo.a和Bar.app放在Release-iphoneos文件夹中。 链接器会很高兴,你可以照常使用-force_load $(BUILT_PRODUCTS_DIR)/libFoo.a。

或者,您可以将Release-iphoneos文件夹添加到Adhoc构buildconfiguration的库searchpath中:

 Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME) 

但是,您必须为每个构buildconfiguration设置一个不同的-force_load:

 Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME) Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a 

我有一个类似的问题,使用CocoaPods并试图有多个Adhoc(或企业或Beta)configuration。

这似乎是工作(假设两个项目都在同一个xcworkspace中):

  • subproject生成的lib添加到具有库的mainproject链接二进制文件。

  • 由于subproject不知道configurationAdhoc ,所以在构build它时,Xcode将使用Releaseconfiguration作为后备(或者可能是列表的第一个configuration)。

  • 链接器会发出抱怨,因为它找不到lib …好吧,让我们来处理这个。

  • 在“目标依赖”阶段之后,将“运行脚本”生成阶段添加到主mainproject 。 input这个脚本:

 if [ "$CONFIGURATION" = "Adhoc" ]; then echo "=====================================" echo "Copying libPods Release into the Adhoc product build dir!" echo "=====================================" cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR" else echo "No manual lib copy." fi 

这将复制由subproject Release build生成的lib(这将在mainproject时发生)在Adhoc构build目录中,以便链接器将findlib。 我们应该好好去! 是啊!

我的框架是使用我的应用程序项目中的另一个SDK项目。 首先我有一个“Debug”和“Release”,然后添加一个新的“TestFlight”configuration。 我无法存档那个新的。 我最终在SDK项目中添加了一个具有相同名称的新构buildconfiguration 。 换句话说,我最终添加了“TestFlight”configuration到我的应用程序和SDK项目。 现在存档工作。

我不确定这是否是最好的方法。 但现在看起来对我来说已经足够干净了。 🙂

呵呵,对于Cocoapods ,复制configuration后,如果你马上运行pod install ,你会得到这个黄色警告:

[!] CocoaPods没有设置你的项目的基本configuration,因为你的项目已经有一个自定义的configuration集。 为了让CocoaPods集成工作,请设置目标的基本configuration…

您必须进入项目,“信息”选项卡,“configuration”部分,select刚刚创build的新configuration,并将所有目标的“Pods.release”先设置为“无” 。 之后,您可以安全地运行pod install

在运行xcodebuild之前,你可以添加CONFIGURATION_BUILD_DIR = / Some / Shared / Dir。 例如:

 cd SOURCE_DIR xcodebuild -workspace YourProject.xcworkspace -scheme YourScheme -configuration AdHoc -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="`pwd`"/build 

通常我有一个AppStorescheme(映射到我的AppStoreconfiguration)。

发生在我身上的一件事是,这个案例敏感的问题是让Pods.buildRelease-iphonesimulator (作为后备)而不是AppStore-iphonesimulatorPods.build生成一个生成文件夹。

我想我链接的scheme和configuration时只是错过点击,只有删除它,重新添加让我明白了什么错了。 检查差异。

敏感的问题

我使用的是cocoapods 0.38.2 ,所以这显然是一个用户错误的configuration,而不是一个0.34上解决的Cocoapods问题