Xcode自定义生成配置导致静态库“找不到库/文件”

时间:2011-12-15 16:52:11

标签: xcode4 build linker static-libraries

我有一个工作区,其中包含一个项目,该项目链接另一个项目中的静态库(也在工作区中)。这是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才能工作的库。

我希望有一些方法:

  • 强制库放置在应用程序目标的构建配置文件夹中
  • 运行后编译&将每个库复制到构建配置文件夹的预链接脚本
  • 指定库的相对路径
  • 使用$ BUILT_PRODUCTS_DIR以外的其他宏来执行-force_load
  • 链接器标志,如-WTFmake-all-problems-go-away

对不起,但我必须这样说...... ARGH!:)

7 个答案:

答案 0 :(得分:26)

正如在类似问题iOS Static Library as a Subproject of a Project That Has Custom Build Configurations?中所述,修复是添加此行

$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

到您的目标Framework Search PathsHeader 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)。

我刚才问过一个类似的问题:What is the correct way to set build configurations in an ios project using static libraries for creating an archive in xcode 4?

答案 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>

我猜我错过了点击链接方案和配置,只删除它并重新添加让我明白出了什么问题。检查差异。

sensitive issue

我使用的是cocoapods 0.38.2 ,所以这显然是用户配置不当而不是Cocoapods issue that was resolved on 0.34