更新到Xcode 10时,iOS静态库目标无法构建。我尝试构建它的方式如下:
xcodebuild -target TargetName -configuration Release clean build
使用Xcode 9时,一切都运行顺利,但是当使用Xcode 10进行构建时,我得到以下错误(清理运行顺利之后):
注意:使用新的构建系统
注意:规划构建
注意:构建构建说明构建系统信息错误: 无法附加数据库:错误:正在访问生成数据库 “ /Users/uerceg/random-path/build/XCBuildData/build.db”:数据库为 锁定可能有两个并发构建在同一运行中 文件系统位置。
**生成失败**
**生成失败**
以下构建命令失败:PhaseScriptExecution MultiPlatform \构建 /Users/uerceg/random-path/build/Library.build/Release-iphoneos/LibraryTarget.build/Script-9DE7C9021AE68FA5001556E5.sh (1次失败)
这可能无关,但是我注意到新的Xcode 10构建系统标志将Copy Bundle Resource
Info.plist文件复制为错误,因此我确保没有重复的条目,但是可能与此错误无关这个事实。
有人知道什么地方可能出问题吗?
答案 0 :(得分:55)
好的,好像我设法解决了。我在/bin/sh
中拥有Build Phases
脚本,该脚本试图构建胖静态库。在脚本中,我设置了OBJROOT
路径,如下所示:
OBJROOT="${OBJROOT}"
似乎Xcode 10和新的构建系统在此途中改变了一些路径,而这行是问题的根源。需要将其调整为:
OBJROOT="${OBJROOT}/DependentBuilds"
此后,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"
问题在此行的build_static_library
方法中:
OBJROOT="${OBJROOT}" \
将该行更改为:
OBJROOT="${OBJROOT}/DependantBuilds" \
为我解决了这个问题。
答案 1 :(得分:32)
答案 2 :(得分:19)
如果您使用构建脚本来像我一样构建子模块的库。
您还需要通过在xcodebuild命令中使用-UseModernBuildSystem=NO
来显式禁用构建脚本中的新构建系统。
例如:
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
答案 3 :(得分:0)
使用此脚本,它将在新的构建系统上正常运行
# Step 1 search RECURSION and if detected stop "*/
if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# Step 2. Build Device and Simulator versions
xcodebuild -target logger ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target logger-configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 -arch x86_64 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 3. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}universal.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"
# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
fi
在Xcode 10构建系统使用单线程之前,但在Xcode 10中使用具有多个线程的新构建系统,因此,每次您运行构建Xcode运行按钮时,该脚本
xcodebuild -target logger ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}".
将再召集一次构建时间,这将创建RECURSION
不要忘了以IF条件结束的脚本来结束脚本
第1步是检测RECURSION并将其停止
答案 4 :(得分:0)
如果您希望保留XCode 10默认的构建系统,但仍在IDE外部(例如,在CI机器中)运行构建,只需将-target
参数替换为-scheme
参数即可您的xcodebuild
命令,例如:
xcodebuild -scheme SchemeName -configuration Release clean build
感谢2015年的this帖子谈到了一个非常相似的问题,它为我提供了解决此问题的提示。正如同一位作者所说,
我会冒险猜测,
xcodebuild
如果没有计划 错误地通过“现代构建系统”,给出了上述错误
答案 5 :(得分:0)
我遇到了同样的问题,请尝试从提示中进行所有操作,但此错误仍然继续。有时会构建项目,而下一次则没有错误。帮助我的解决方案是编辑方案并关闭Parallelize Build。之后,一切正常。
答案 6 :(得分:0)
在我的构建脚本中添加清除派生数据步骤(在Xcode构建之前)似乎可以解决我的问题。
不确定是否相关,但是我的项目使用Realm(与CocoaPods一起安装)。这是GitHub问题,启发了“修复”-> https://github.com/realm/realm-cocoa/issues/5812。
答案 7 :(得分:0)
我在运行 swift run <your_proj>
时遇到了这个问题。
可以通过删除 build.db
文件及其同级文件和目录来快速修复。这可能看起来微不足道,但它对我有用。
答案 8 :(得分:0)
我重新发布这个是因为版主认为删除我之前的回答是合适的。
由于 xcframeworks 的要求,我在通过构建升级到新构建系统时遇到了同样的问题。
错误:“.....Build/Intermediates.noindex/XCBuildData/build.db”:数据库被锁定 可能有两个并发构建在同一文件系统位置运行。” >
之前使用 xcodebuild( )
触发时构建工作正常
以上/批准的答案都不适合我。
对我有用的是在我的 Fastlane 脚本中从 xcodebuild( )
切换到 build_app( )
。
希望这个答案对未来的人有所帮助。