c++ - 在没有 Xcode 的 Mac Bundle 中嵌入框架

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

我现在正在尝试在 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 外部使用它。

最佳答案

有几种不同的方法可以在 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

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

关于c++ - 在没有 Xcode 的 Mac Bundle 中嵌入框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365607/

相关文章:

c++ - 将 lambda 函数转换为函数指针是否安全?

ios - 在哪里可以找到有关 Mach 内核消息传递的良好文档

android - 不受支持的记录版本Unknown-2.0 android studio

c# - 需要 Mono 内置的 ChromeDriver

cocoa - 音频队列服务录制到 .mp4 文件,但无法播放。还有魔法 cookies 问题

java - OpenCV android VideoWriter 问题

c++ - STL deque::insert() 的复杂性

c++ - cmake 如何在 C++ 中将编译器标志附加到末尾

objective-c - 从 AppDelegate 调用 AppController 现有实例的方法

objective-c - Cocoa 弹出窗口动画