Xcode 10:无法附加数据库错误

uer*_*ceg 36 xcodebuild ios xcode10

更新到Xcode 10时,iOS静态库目标无法构建.我如何构建它的方式如下:

xcodebuild -target TargetName -configuration Release clean build
Run Code Online (Sandbox Code Playgroud)

使用Xcode 9,一切都运行顺利,但是当Xcode 10用于构建时,我收到了以下错误(在清理运行顺利之后):

注意:使用新的构建系统

注意:规划构建

注意:构建构建描述构建系统信息错误:无法附加DB:错误:访问构建数据库"/Users/uerceg/random-path/build/XCBuildData/build.db":数据库已锁定可能有两个并发构建正在运行相同的文件系统位置.

**建筑失败**

**建筑失败**

以下构建命令失败:PhaseScriptExecution MultiPlatform\Build /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh(1 failure)

这可能是无关的,但我注意到新的Xcode 10构建系统将重复的Copy Bundle ResourceInfo.plist文件标记为错误,所以我确实确保没有重复的条目,但可能这个错误与此事实无关.

有谁知道什么可能是错的?

uer*_*ceg 62

好吧,好像我设法解决了它.我正在尝试构建胖静态库的/bin/sh脚本Build Phases.在脚本中,我有这样的OBJROOT路径设置:

OBJROOT="${OBJROOT}"
Run Code Online (Sandbox Code Playgroud)

看起来像Xcode 10和新的构建系统在途中改变了一些路径,这一行是问题的根源.它需要调整为:

OBJROOT="${OBJROOT}/DependentBuilds"
Run Code Online (Sandbox Code Playgroud)

之后,xcodebuild设法构建此目标,而不会出现Xcode 10中引入的新构建系统的问题.

我自己没有得到这个解决方案,非常感谢Matt Gallagher和他在这里的帖子:https://github.com/mattgallagher/CwlSignal/issues/24#issuecomment-396931001


正如@TMin在评论中所要求的,这是我的脚本的样子:

set -e

# If we're already inside this script then die
if [ -n "$RW_MULTIPLATFORM_BUILD_IN_PROGRESS" ]; then
exit 0
fi
export RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1

RW_FRAMEWORK_NAME=${PROJECT_NAME}
RW_INPUT_STATIC_LIB="lib${PROJECT_NAME}.a"
RW_FRAMEWORK_LOCATION="${BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework"

function build_static_library {
    echo "1"
    echo "${BUILD_DIR}"
    # Will rebuild the static library as specified
    #     build_static_library sdk
    xcrun xcodebuild -project "${PROJECT_FILE_PATH}" \
    -target "${TARGET_NAME}" \
    -configuration "${CONFIGURATION}" \
    -sdk "${1}" \
    ONLY_ACTIVE_ARCH=NO \
    BUILD_DIR="${BUILD_DIR}" \
    OBJROOT="${OBJROOT}" \
    BUILD_ROOT="${BUILD_ROOT}" \
    SYMROOT="${SYMROOT}" $ACTION
}

function make_fat_library {
    # Will smash 2 static libs together
    #     make_fat_library in1 in2 out
    xcrun lipo -create "${1}" "${2}" -output "${3}"
}

# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name
if [[ "$SDK_NAME" =~ ([A-Za-z]+) ]]; then
RW_SDK_PLATFORM=${BASH_REMATCH[1]}
else
echo "Could not find platform name from SDK_NAME: $SDK_NAME"
exit 1
fi

# 2 - Extract the version from the SDK
if [[ "$SDK_NAME" =~ ([0-9]+.*$) ]]; then
RW_SDK_VERSION=${BASH_REMATCH[1]}
else
echo "Could not find sdk version from SDK_NAME: $SDK_NAME"
exit 1
fi

# 3 - Determine the other platform
if [ "$RW_SDK_PLATFORM" == "iphoneos" ]; then
RW_OTHER_PLATFORM=iphonesimulator
else
RW_OTHER_PLATFORM=iphoneos
fi

# 4 - Find the build directory
if [[ "$BUILT_PRODUCTS_DIR" =~ (.*)$RW_SDK_PLATFORM$ ]]; then
RW_OTHER_BUILT_PRODUCTS_DIR="${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}"
else
echo "Could not find other platform build directory."
exit 1
fi

# Build the other platform.
build_static_library "${RW_OTHER_PLATFORM}${RW_SDK_VERSION}"

# If we're currently building for iphonesimulator, then need to rebuild
#   to ensure that we get both i386 and x86_64
if [ "$RW_SDK_PLATFORM" == "iphonesimulator" ]; then
build_static_library "${SDK_NAME}"
fi

# Join the 2 static libs into 1 and push into the .framework
make_fat_library "${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}" \
"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk"

# Ensure that the framework is present in both platform's build directories
cp -a "${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}Sdk" \
"${RW_OTHER_BUILT_PRODUCTS_DIR}/static/${RW_FRAMEWORK_NAME}Sdk.framework/Versions/A/${RW_FRAMEWORK_NAME}Sdk"

# Copy the framework to the project directory
ditto "${RW_FRAMEWORK_LOCATION}" "${SRCROOT}/Frameworks/static/${RW_FRAMEWORK_NAME}Sdk.framework"
Run Code Online (Sandbox Code Playgroud)

问题build_static_library在于此方法中的方法:

OBJROOT="${OBJROOT}" \
Run Code Online (Sandbox Code Playgroud)

将该行更改为:

OBJROOT="${OBJROOT}/DependantBuilds" \
Run Code Online (Sandbox Code Playgroud)

为我解决了这个问题.

  • 不幸的是,这对我来说没有解决问题(我的项目中没有使用`$ {OBJROOT}`) (3认同)
  • 就我而言,我遇到了一个错误“错误:访问构建数据库.../Build/Intermediates.noindex/XCBuildData/build.db:磁盘 I/O 错误”,我添加了“OBJROOT”参数并解决了我的问题。谢谢! (2认同)

小智 40

打开XCode文件 - >项目设置

构建系统 - >遗留构建系统

配置版本10.0项目设置的XCode可以解决问题.

  • 任何人都可以向我解释它的不同之处吗? (7认同)

Shi*_*Ken 19

如果您使用构建脚本来构建像我这样的子模块库.您还需要-UseModernBuildSystem=NO在xcodebuild命令中显式禁用构建脚本中的新构建系统.

例如:

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}" -UseModernBuildSystem=NO
Run Code Online (Sandbox Code Playgroud)


Cat*_*rta 12

删除派生数据对我有用。看看如何做到这一点:https://programmingwithswift.com/delete-driven-data-xcode/