Xcode4 Xcode自定义生成配置导致“错误”;“找不到库/文件”;对于静态库

Xcode4 Xcode自定义生成配置导致“错误”;“找不到库/文件”;对于静态库,xcode4,build,linker,static-libraries,Xcode4,Build,Linker,Static Libraries,我有一个带有项目的工作区,该项目与另一个项目(也在工作区中)中的静态库链接。这是一个我一直无法解决的问题,尽管我知道原因,我想这是个问题 项目目标和静态库目标都具有调试和发布构建配置。一切都很好 现在有人在项目中添加了一个新的构建配置,并将其命名为Ad Hoc。现在,项目的目标构建了特别的配置,但是静态库没有这样的配置。显然,它们随后默认构建版本配置 Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_N

我有一个带有项目的工作区,该项目与另一个项目(也在工作区中)中的静态库链接。这是一个我一直无法解决的问题,尽管我知道原因,我想这是个问题

项目目标和静态库目标都具有调试发布构建配置。一切都很好

现在有人在项目中添加了一个新的构建配置,并将其命名为Ad Hoc。现在,项目的目标构建了特别的配置,但是静态库没有这样的配置。显然,它们随后默认构建版本配置

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
最后,当链接器应该将所有内容组合在一起时,它失败了:

ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1
对于通过
-force\u load$(build\u PRODUCTS\u DIR)/libSomeLib.a强制加载的库,错误类似,但表示“未找到文件”。我应该注意到库“libbox2dios.a”位于“链接二进制文件与库”构建阶段列表中

显然,问题在于链接器假设库位于build_PRODUCTS_DIR的Ad Hoc iphoneos文件夹中,而它们实际上位于Release iphoneos文件夹中,因为它们没有Ad Hoc构建配置

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
我怎么能打链接器的耳光,告诉他把图书馆放在哪里?最好我正在寻找一个解决方案,它可以同时适用于这两种情况,ie库添加了标准方式(链接二进制与库构建阶段)和需要额外强制加载才能工作的库

我希望有办法:

  • 强制将库放置在应用程序目标的生成配置文件夹中
  • 运行编译后和预链接脚本,将每个库复制到生成配置文件夹
  • 指定库的相对路径
  • 对于-force\u load,请使用不同于$build\u PRODUCTS\u DIR的宏
  • 像-WTFmake这样的链接器标志可以消除所有问题

对不起,我得说…:)

不幸的是,我没有找到一种方法来做到这一点。我能找到的最佳解决方法是添加新的目标,而不是新的构建配置。例如,在我的一个项目中,我只有发布和调试配置,但我有额外的目标,称为“MyProject-app store”和“MyProject-ad hoc”。当然,这只有在您控制了项目文件的情况下才可能实现

在极端情况下,有重复的目标是令人讨厌的,因为您可以将文件添加到一个目标,而忘记将它们添加到其他目标,并且在尝试构建它之前,您不会知道。但它确实构建了,这是一个胜利(无论如何,使用xcode)


我刚才问了一个类似的问题:

您可以在运行xcodebuild之前添加CONFIGURATION\u BUILD\u DIR=/Some/Shared/DIR。例如:

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

这是对我有用的东西

在具有临时生成配置的项目中,覆盖临时生成配置的“每配置生成产品路径”(配置生成目录)和“每配置中间生成文件路径”(配置临时目录),以使用与发布配置相同的文件夹

Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
现在,当您进行临时构建时,Xcode将把libFoo.a和Bar.app放在Release iphoneos文件夹中。链接器会很高兴,您可以像往常一样使用-force\u load$(builded\u PRODUCTS\u DIR)/libFoo.a

或者,您可以将Release iphoneos文件夹添加到临时构建配置的库搜索路径中:

Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
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
但是,您必须为每个构建配置设置不同的-force_负载:

Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
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和尝试使用多个临时(或企业,或Beta)配置时遇到了类似的问题

以下是似乎有效的方法(假设两个项目位于同一个工作区中):

  • 子项目
    生成的库添加到
    mainproject
    链接二进制库

  • 由于
    子项目不知道配置
    Adhoc
    ,Xcode在构建时将使用
    发布
    配置作为备用配置(或者可能是列表的第一个配置)

  • 链接器会抱怨,因为它找不到库…好的,让我们来处理这个

  • 将运行脚本构建阶段添加到
    mainproject
    ,就在目标依赖项阶段之后。输入以下脚本:

if[“$CONFIGURATION”=“Adhoc”];然后
回声“==============================================================================================================================================================================================================================================================================
echo“将libPods版本复制到临时产品构建目录中!”
回声“==============================================================================================================================================================================================================================================================================
cp“$BUILD\U PRODUCTS\U DIR/。/Release-$PLATFORM\U NAME/libPods.a”“$BUILD\U PRODUCTS\U DIR”
其他的
echo“无手动库副本”
fi


这将复制由
子项目
发布
生成的库(在
mainproject
生成时发生)在
临时
生成目录中,以便链接器找到库。我们应该可以走了!是啊

正如在类似问题中所说的,修复方法是添加这一行

$(构建目录)/发布$(有效平台名称)


到目标的
框架搜索路径
标题搜索路径
和/或
库搜索路径

我的框架是使用我的应用程序项目中的另一个SDK项目构建的。首先我有一个“Debug”和“Release”,然后我添加了一个新的“TestFlight”配置。我不能用那个新的存档。最后,我在SDK项目中添加了一个同名的新构建配置。换句话说,我最终将“TestFlight”配置添加到我的应用程序和SDK项目中。现在档案馆工作了

我不确定这是不是最好的办法