Lea*_*s2D 43 linker build static-libraries xcode4
我有一个工作区,其中包含一个项目,该项目链接到另一个项目中的静态库(也在工作区中).这是Kobold2D中的一个问题我无法解决,即使我理解原因,我想它与这个问题类似.
项目目标和静态库目标都具有Debug和Release构建配置.一切都很好.
现在,有人在项目中添加了新的构建配置,并将其命名为Ad-Hoc.现在,项目的目标构建了Ad-Hoc配置,但是静态库没有这样的配置.显然,他们默认构建Release配置.
最后,当链接器应该将所有内容组合在一起时,它会失败:
ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1
Run Code Online (Sandbox Code Playgroud)
对于通过-force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a错误强行加载的库类似但是说"找不到文件".我应该注意,库"libbox2d-ios.a"位于"带库的链接二进制"构建阶段列表中.
显然问题是链接器假设这些库位于BUILT_PRODUCTS_DIR中的Ad-Hoc-iphoneos文件夹中,而它们实际上位于Release-iphoneos文件夹中,因为它们没有Ad-Hoc构建配置.
我怎么能把连接器打到脸上并告诉他把它们放在哪里呢?最好是我正在寻找适用于这两种情况的解决方案,即库添加标准方式(链接二进制文件库构建阶段)和需要额外-force_load才能工作的库.
我希望有一些方法可以:
对不起,但我不得不这样说...... ARGH!:)
ULa*_*ins 30
正如类似问题iOS静态库作为具有自定义构建配置的项目的子项目所述?,修复是添加此行
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
到你的目标Framework Search Paths,Header Search Paths和/或Library Search Paths
小智 20
这是适合我的东西.
在具有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)
Run Code Online (Sandbox Code Playgroud)
现在当你进行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)
Run Code Online (Sandbox Code Playgroud)
但是,您必须为每个构建配置设置不同的-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
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题使用CocoaPods并尝试拥有多个Adhoc(或企业版或Beta版)配置.
这似乎工作(假设两个项目都在同一个xcworkspace中):
将subproject生成的lib 添加到mainprojectLink Binary with Libraries.
由于配置Adhoc未知subproject,Xcode将Release在构建时使用配置作为后备(或者可能是列表的第一个配置).
链接器会抱怨,因为它找不到lib ...好吧,让我们来处理这个.
mainproject在Target Dependencies阶段之后立即添加Run Script构建阶段.输入此脚本:
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
这将复制构建目录中生成的lib(在subproject Release构建时将发生mainproject)Adhoc,以便链接器将找到lib.我们应该好好去!是啊!
不幸的是,我还没有找到办法做到这一点.我能找到的最佳解决方法是添加新目标而不是新构建配置.因此,例如在我的一个项目中,我只有Release和Debug配置,但我有额外的目标称为"MyProject - app store"和"MyProject - ad hoc".只有当您控制项目文件时才能实现这一点.
坐在周围的重复目标很烦人,因为你可以将文件添加到一个目标而忘记将它们添加到其他目标,直到你尝试构建它时才会知道.但它确实构建,这是一个胜利(无论如何使用xcode).
我刚才问过一个类似的问题:在ios项目中使用静态库在xcode 4中创建存档的正确方法是什么?
我的框架是使用我的应用程序项目中的另一个 SDK 项目构建的。首先我有一个“调试”和“发布”,然后我添加一个新的“TestFlight”配置。我不能用那个新的存档。我最终在 SDK 项目中添加了一个同名的新构建配置。换句话说,我最终将“TestFlight”配置添加到我的应用程序和 SDK 项目中。现在存档工作。
我不确定这是否是最好的方法。但现在对我来说它看起来足够干净。:)
哦,对于Cocoapods,在你复制配置后,如果你pod install马上运行你会得到这个黄色警告:
[!] CocoaPods 没有设置你的项目的基本配置,因为你的项目已经有一个自定义的配置集。为了让 CocoaPods 集成工作,请设置目标的基本配置...
您必须转到项目,“信息”选项卡,“配置”部分,选择您刚刚创建的新配置,然后首先将所有目标的“Pods.release”设置为“无”。之后,您就可以pod install安全地运行了。