【问题标题】:Embed Frameworks in Mac Bundle Without Xcode在没有 Xcode 的 Mac Bundle 中嵌入框架
【发布时间】:2020-06-07 11:23:24
【问题描述】:

我现在正在尝试在 macOS 上创建一个游戏引擎,并且只是尝试设置一个 makefile 以将代码编译到没有 Xcode 的 macOS App Bundle 中。如果我只是链接 src 代码,我可以轻松地创建一个包,但我想将它作为一个框架嵌入。如果我使用 Xcode Embed Frameworks 那么它真的很容易,但我无法弄清楚它是如何实现这种效果的。这是我的makefile的代码:

# Fill in Details for Compiler
PRJNAME = YetiGame
GAMEFILES = Example/Game.cpp
COMPILER = clang++

# Don't Change Unless Modifying Engine
LIBFILES = Yeti/Application/Application.cpp
OSXMACROS = -D YETI_PLATFORM_MACOS
SRCPATH = $(shell pwd)/
LIBFLAGS = -I $(SRCPATH) -framework Cocoa -framework Metal -framework Metalkit -framework QuartzCore -framework Foundation -o $(PRJNAME) -F$(SRCPATH) -framework @rpath@executable_path/../Frameworks/Neptune -v
LIBFILES = Yeti/Application/Application.cpp Yeti/Renderer/Metal/2D/metalRenderer2D.mm Yeti/Renderer/Metal/metalView.mm Yeti/Renderer/Metal/metalApplication.mm Yeti/Renderer/Metal/metalApplicationWrapper.mm Yeti/Renderer/Metal/metalDelegate.mm Yeti/Renderer/Metal/metalWindow.mm

app:
    $(COMPILER) $(LIBFILES) $(GAMEFILES) $(LIBFLAGS) $(OSXMACROS)
    mkdir -p _macOS/Contents/macOS/
    mv $(PRJNAME) _macOS/Contents/macOS/YetiExecutable
    cp Resources/Info.plist _macOS/Contents/Info.plist
    mkdir _macOS/Contents/Resources/
    cp Resources/temp.icns _macOS/Contents/Resources/temp.icns
    mv _macOS $(PRJNAME).app

clean:
    rm -R $(PRJNAME).app

现在我刚刚在 Xcode 中编译了一个框架,并希望将它链接到我的项目以记录一些内容并在 Xcode 中对其进行测试。我希望能够在 Xcode 中编译框架并从 xcode 外部使用它。

【问题讨论】:

    标签: c++ macos cocoa game-engine app-bundle


    【解决方案1】:

    在 MacOS 上有几种不同的方法可以动态链接库。一种选择是使用dlopen()。这允许用户在代码中手动链接到库。下面是一个在 OpenGL 函数加载器中使用的示例:

    #include <stdlib.h>
    #include <dlfcn.h>
    
    static void* libgl;
    
    void CloseOpenGL()
    {
      dlclose(libgl);
    }
    
    bool LoadOpenGL()
    {
      libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL);
    
      if (!libgl)
        return false;
    
      atexit(CloseOpenGL);
      return true;
    }
    
    void* LoadFunctionProc(const char* name)
    {
      return dlsym(libgl, name);
    }
    

    另一个选项是在链接时指定库。当您链接到动态(或静态)库时,这就是 Xcode 在幕后所做的事情。 clang 的标志是-l

    在任何一种情况下,您都需要小心确保可执行文件可以在运行时找到该库。在系统库的情况下,链接器应该自动处理它。但是,如果您创建应用程序包,则需要将库保留在包中。

    【讨论】:

      猜你喜欢
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 2015-10-07
      • 2011-05-11
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多