将框架嵌入到 Mac 捆绑包中而不 Xcode
Embed Frameworks in Mac Bundle Without Xcode
我现在正在尝试在 macOS 上创建一个游戏引擎,我只是想设置一个 makefile 来将代码编译成一个没有 Xcode 的 macOS App Bundle。如果我只是 link 源代码,我可以很容易地创建一个包,但我想将它作为一个框架嵌入。如果我使用 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 中编译了一个框架,并想 link 将其添加到我的项目中以记录一些内容并在 Xcode 中对其进行测试。我希望能够在 Xcode 中编译框架并在 xcode 之外使用它。
有几种不同的方法可以在 MacOS 上动态 link 库。一种选择是使用 dlopen()
。这允许用户在代码中手动 link 到库。这是一个在 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);
}
另一种选择是在 link 时指定库。这就是当您 link 访问动态(或静态)库时 Xcode 将在幕后执行的操作。 clang 的标志是 -l
.
无论哪种情况,您都需要小心确保可执行文件可以在运行时找到该库。在系统库的情况下,linker 应该自动处理它。但是,如果您创建应用程序包,则需要将库保留在包中。
我现在正在尝试在 macOS 上创建一个游戏引擎,我只是想设置一个 makefile 来将代码编译成一个没有 Xcode 的 macOS App Bundle。如果我只是 link 源代码,我可以很容易地创建一个包,但我想将它作为一个框架嵌入。如果我使用 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 中编译了一个框架,并想 link 将其添加到我的项目中以记录一些内容并在 Xcode 中对其进行测试。我希望能够在 Xcode 中编译框架并在 xcode 之外使用它。
有几种不同的方法可以在 MacOS 上动态 link 库。一种选择是使用 dlopen()
。这允许用户在代码中手动 link 到库。这是一个在 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);
}
另一种选择是在 link 时指定库。这就是当您 link 访问动态(或静态)库时 Xcode 将在幕后执行的操作。 clang 的标志是 -l
.
无论哪种情况,您都需要小心确保可执行文件可以在运行时找到该库。在系统库的情况下,linker 应该自动处理它。但是,如果您创建应用程序包,则需要将库保留在包中。