29

我正在开发一个应用程序,我正在使用一个开源组件。

我有一个包含MyApp.xcodeprojComponent.xcodeproj的工作区。我的应用程序具有三种配置:DebugApp StoreIn House但组件只有两种:DebugRelease

Debug配置中,一切正常,但我无法在App StoreIn House配置中编译我的应用程序,因为配置名称不匹配。尝试时收到文件未找到错误#import <Component/Component.h>

我需要App StoreIn House配置,并且我真的很想避免修改组件的配置,以简化组件的未来更新。

我知道我可以使用 CocoaPods 来解决这个问题,但我想知道 Xcode 中是否有简单的解决方案

4

3 回答 3

47

您可以通过对应用程序设置进行一些调整来编译您的项目。

我建议您在项目级别修改所有设置,以便您的所有目标都可以继承这些设置。

  1. 添加新的DEFAULT_CONFIGURATION用户定义设置并定义您的配置映射。它应该是这样的:

    默认配置截图

  2. 为所有配置设置FRAMEWORK_SEARCH_PATHS$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME),添加任何 OS X SDK变体并将值设置为$(BUILD_DIR)/$(DEFAULT_CONFIGURATION). 设置HEADER_SEARCH_PATHS$(FRAMEWORK_SEARCH_PATHS)/include和。LIBRARY_SEARCH_PATHS_ $(FRAMEWORK_SEARCH_PATHS)它应该是这样的:

    搜索路径截图

    这一步非常繁琐,可以使用xcproj工具并通过在项目目录中运行此脚本来自动化。根据需要编辑配置映射。

    #!/bin/bash
    
    CONFIGURATIONS=( "App Store:Release" "In House:Release" "Debug:Debug" )
    
    for CONFIGURATION in "${CONFIGURATIONS[@]}"; do
        xcproj --configuration "${CONFIGURATION%%:*}" write-build-setting DEFAULT_CONFIGURATION "${CONFIGURATION#*:}"
    done
    
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)'
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS[sdk=macosx*]' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)'
    
    xcproj write-build-setting 'HEADER_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)/include'
    xcproj write-build-setting 'LIBRARY_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)'
    
  3. 如果组件是作为静态库分发的,那么您就完成了。如果组件作为框架出现,您必须通过在文本编辑器中编辑 project.pbxproj 文件来更新其路径引用。在 PBXFileReference 部分(下/* Begin PBXFileReference section */)找到Component.framework并更新它path,如下所示:

    name = Component.framework; path = "../$(DEFAULT_CONFIGURATION)/Component.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
    

    还要确保将sourceTree设置为BUILT_PRODUCTS_DIR,即相对于已构建的产品。编辑项目文件后,应如下所示:

    位置截图

您的项目现在应该按预期构建。

于 2015-06-17T07:19:03.187 回答
6

我遇到了同样的问题,但是我的应用程序中有多个配置(Debug、TestFlight、Release、Enterprise),并且粗体配置总是无法构建,因为它找不到框架。我真的不想弄乱我的子项目的项目设置,以便轻松更新它们。

我找到的答案是只更新框架搜索路径,以说明框架将在子项目的发布(或任何默认配置设置)中删除。

具体来说,我将其设置为: $(BUILD_DIR)/Release-$(PLATFORM_NAME)

我也将其设置为递归。这适用于模拟器和设备,在 Xcode 和命令行中构建。

于 2017-03-19T05:57:36.603 回答
1

我通过以下方式解决了它,

在我的依赖项目中 Project -> Target -> Build Phases,添加了新的运行脚本

TARGET_DIR="Build"
TARGET_FILE="${TARGET_DIR}/${FULL_PRODUCT_NAME}"
mkdir -p ${TARGET_DIR}
rm -rf ${TARGET_FILE}
cp -rf "${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}" ${TARGET_DIR}

每次构建后,我将构建复制到项目内的构建目录中。从主项目中 Project -> Target -> General,我拖放了依赖框架(位于依赖项目的Build文件夹中),然后 Project -> Target -> Build Settings -> Framework Search Paths,在我的自定义构建配置下,我添加了以下内容

$(PROJECT_DIR)/../DependencyProject/Build

该文件夹是相对于我的主项目,这应该是相对于您的项目。然后在我的所有方案中,我为 Build with 添加了一个 Pre-actions 脚本

rm -Rf "${PROJECT_DIR}/../DependencyProject/Build"

此外,您还需要针对Provide build settings from下拉菜单选择应用程序。

于 2020-08-29T14:30:33.370 回答