【问题标题】:Build Unity native bundle with CMake on OSX在 OSX 上使用 CMake 构建 Unity 本机包
【发布时间】:2015-12-03 20:35:10
【问题描述】:

我有一个 Xcode 项目,它构建了一个包含库的包。我使用以下菜单创建了项目:

新项目 -> 框架和库 -> Bundle

为了提供更多上下文,我想创建一个native plugin for Unity。目前头文件非常简单,只包含一个头文件和一个源文件。

我现在希望能够使用 CMake 生成一个类似的项目,但我正在努力让它工作。

我的 CMake 文件归结为:

cmake_minimum_required(VERSION 3.3)
project(Plugin)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES Plugin.cpp)
add_library(Plugin SHARED ${SOURCE_FILES})

上面的脚本构建了一个 .dylib 文件,我想让它构建一个 .bundle 文件。

我发现add_executable 有一个 MACOSX_BUNDLE 选项,但它对我不起作用,因为我想捆绑一个库。还有一个名为 BUNDLE 的目标属性,但它似乎对我的项目没有任何改变 - 当我希望获得一个 .bundle 文件时,它仍然会创建一个 .dylib 文件。

我阅读了this question,它似乎提出了一个有效的解决方案,但我无法让它适用于我的项目。

任何帮助表示赞赏。

【问题讨论】:

    标签: c++ xcode macos unity3d cmake


    【解决方案1】:

    使用 CMake:

    add_library(Plugin MODULE ${SRCS})
    set_target_properties(Plugin PROPERTIES BUNDLE TRUE)
    

    将使用Contents/MacOS/Plugin 创建Plugin.bundle 文件夹

    BUNDLE 属性描述为here

    另外,根据 Unity3D 论坛上的this post,只需将 .dylib 重命名为 .bundle 也可以。

    在 CMake 中,这将是:

    set_target_properties(Plugin PROPERTIES SUFFIX ".bundle")
    

    【讨论】:

    【解决方案2】:

    我不使用 CMake,但我已经为 iOS 和 OSX 构建了一个 Unity 本机库。我通过调用xcodebuild 使用构建脚本为这两个平台构建。它为 iOS 构建了一个静态库,为 OSX 构建了一个动态库,当将构建的库复制到位时,.dylib 简单地重命名为.bundle

    这是我的构建脚本,如果有帮助的话:

    #!/bin/sh
    
    PROJECT=UnityPlugin_UserDefaults.xcodeproj
    CONFIGURATION=Release
    BUILDDIR=build
    OSXARCHIVEDIR=UserDefaults_OSX.xcarchive
    IOSLIB=../Plugins/iOS/libUserDefaults.a
    OSXLIB=../Plugins/UserDefaults.bundle
    
    rm -rf $BUILDDIR $OSXARCHIVEDIR
    
    for sdk in iphoneos iphonesimulator
    do
        xcodebuild -project $PROJECT -configuration $CONFIGURATION -scheme UserDefaults_iOS -derivedDataPath $BUILDDIR -sdk $sdk build || exit 2
    done
    
    mkdir -p $(dirname $IOSLIB)
    rm -f $IOSLIB
    xcrun lipo \
        $BUILDDIR/Build/Products/$CONFIGURATION-iphoneos/libUserDefaults.a \
        $BUILDDIR/Build/Products/$CONFIGURATION-iphonesimulator/libUserDefaults.a \
        -output $IOSLIB \
        -create || exit 3
    
    echo Created $IOSLIB:
    file $IOSLIB
    
    xcodebuild -project $PROJECT -configuration $CONFIGURATION -scheme UserDefaults_OSX -derivedDataPath $BUILDDIR -archivePath $OSXARCHIVEDIR -sdk macosx archive || exit 4
    
    mkdir -p $(dirname $OSXLIB)
    cp $OSXARCHIVEDIR/Products/usr/local/lib/libUserDefaults.dylib $OSXLIB || exit 5
    
    echo Created $OSXLIB:
    file $OSXLIB
    
    rm -rf $BUILDDIR
    

    Xcode 项目包含每个平台的目标,其中包含用于定义要构建的方案

    【讨论】:

    • 我不知道您可以将动态库重命名为 .bundle(至少在 Unity 中)。这对我来说是全新的,但我认为包和动态库是不同的东西。它解决了我的问题,所以我会接受答案。从 CMake 正确构建一个包将是另一个问题的主题:-)
    • @Clem 是的,动态库和捆绑包是不同的,但是 Unity 似乎不正确地对待它们似乎......
    猜你喜欢
    • 2014-05-27
    • 1970-01-01
    • 2012-08-04
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 2014-02-26
    相关资源
    最近更新 更多