我有一个工作区,其中包含一个项目,该项目链接另一个项目中的静态库(也在工作区中)。这是Kobold2D中的一个问题我无法解决,即使我理解其原因,我想它是similar to this question。
项目目标和静态库目标都具有调试和发布构建配置。一切都很好。
现在有人在项目中添加了新的构建配置,并将其命名为 Ad-Hoc 。现在,项目的目标构建了 Ad-Hoc 配置,但是静态库没有这样的配置。显然,他们默认构建发布配置。
最后,当链接器应该将所有内容组合在一起时,它会失败:
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”位于“带库的链接二进制”构建阶段列表中。
显然问题是链接器假设这些库位于BUILT_PRODUCTS_DIR的 Ad-Hoc-iphoneos 文件夹中,而它们实际上位于 Release-iphoneos 中文件夹,因为它们没有 Ad-Hoc 构建配置。
我怎样才能将链接器打到脸上并告诉他将库放在哪里?最好是我正在寻找适用于这两种情况的解决方案,即库添加标准方式(链接二进制文件构建阶段)和需要额外-force_load才能工作的库。
我希望有一些方法:
对不起,但我必须这样说...... ARGH!:)
答案 0 :(得分:26)
正如在类似问题iOS Static Library as a Subproject of a Project That Has Custom Build Configurations?中所述,修复是添加此行
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
到您的目标Framework Search Paths
,Header Search Paths
和/或Library Search Paths
答案 1 :(得分:19)
这是适合我的东西。
在具有Adhoc构建配置的项目中,覆盖“按配置构建产品路径”(CONFIGURATION_BUILD_DIR)和“每配置中间构建文件路径”(CONFIGURATION_TEMP_DIR),以便Adhoc构建配置使用与发布配置。
Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
现在,当您进行Adhoc构建时,Xcode会将libFoo.a和Bar.app放在Release-iphoneos文件夹中。链接器会很高兴你可以像往常一样使用-force_load $(BUILT_PRODUCTS_DIR)/libFoo.a。
或者,您可以将Release-iphoneos文件夹添加到Adhoc构建配置的库搜索路径中:
Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
但是,您必须为每个构建配置设置不同的-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
答案 2 :(得分:6)
不幸的是,我还没有办法做到这一点。我能找到的最佳解决方法是添加新目标而不是新构建配置。因此,例如在我的一个项目中,我只有Release和Debug配置,但我有额外的目标称为“MyProject - app store”和“MyProject - ad hoc”。只有当你控制了项目文件时才能实现这一点。
让重复的目标坐在周围很烦人,因为你可以将文件添加到一个目标并忘记将它们添加到其他目标,直到你尝试构建它时才会知道。但它确实构建,这是一个胜利(无论如何使用xcode)。
答案 3 :(得分:5)
我在使用CocoaPods时遇到了类似的问题,并尝试使用多个Adhoc(或企业版或Beta版)配置。
这似乎有效(假设这两个项目都在同一个xcworkspace中):
将subproject
生成的lib添加到mainproject
Link Binary with Libraries。
由于Adhoc
不知道配置subproject
,Xcode会在构建时使用Release
配置作为后备(或者可能是列表的第一个配置)它
链接器会抱怨因为找不到lib ...好吧,让我们来处理这个。
在目标依赖关系阶段之后立即向mainproject
添加运行脚本构建阶段。输入以下脚本:
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
mainproject
构建(在构建Adhoc
时会发生)生成的lib,以便链接器将找到lib。我们应该好好去!呀!
答案 4 :(得分:4)
我的框架是使用我的app项目中的另一个SDK项目构建的。首先我有一个“Debug”和“Release”,然后我添加一个新的“TestFlight”配置。我无法使用新的存档。我最终在SDK项目中添加了一个具有相同名称的新构建配置。换句话说,我最终在我的应用程序和SDK项目中添加了“TestFlight”配置。现在存档工作。
我不确定这是否是最佳方式。但它现在看起来很干净。 :)
哦,对于 Cocoapods ,在您复制配置后,如果您立即运行pod install
,您将收到此黄色警告:
[!] CocoaPods没有设置项目的基本配置,因为您的项目已经有自定义配置集。为了使CocoaPods集成完全起作用,请设置目标的基本配置......
您必须转到项目,“信息”标签,“配置”部分,选择刚刚创建的新配置,并将所有目标的“Pods.release”设置为“无”第一。之后,您可以安全地运行pod install
。
答案 5 :(得分:0)
您可以在运行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
答案 6 :(得分:0)
通常我有一个AppStore
方案(映射到我的AppStore
配置)。
发生在我身上的一件事是,这个区分大小写的问题让Cocoapods在Pods.build
内生成了Release-iphonesimulator
的构建文件夹(作为后备),而不是AppStore-iphonesimulator
。< / p>
我猜我错过了点击链接方案和配置,只删除它并重新添加让我明白出了什么问题。检查差异。
我使用的是cocoapods 0.38.2 ,所以这显然是用户配置不当而不是Cocoapods issue that was resolved on 0.34