我很难理解动态库的概念。
我目前正在使用多个外部动态库在 C++ 中开发跨平台游戏。使用 OSX 上的 CMake GUI,我为我的程序构建了几乎所有依赖项,包括 Box2D、SFML、Thor 和 CEGUI(进行中),并将它们放在我桌面上的特定文件夹中。由于我不熟悉这些库,因此我创建了一个测试项目,其中包含我对 soul objectif 的所有依赖项,以验证我的动态库是否有效。
这是我对动态库的理解:
Dylib 需要位于
Frameworks
文件夹中的应用程序包内。它们需要通过 XCode 中的build设置链接到您的项目。
与静态库相比,Dylibs 有助于减小应用程序的大小。
考虑到这一点,我尝试了我的测试项目的设置和构建阶段,并为每个依赖项创建了一个脚本,它将 dylib 从我的桌面复制到我的应用程序包的 Frameworks
文件夹中每次我构建项目时。
该应用程序(包括来自外部库的所有功能)都可以运行。
对此我唯一不明白的是,如果我需要将它们全部复制到我的应用程序包中,dylib 如何“减小应用程序的大小”?我猜如果要在另一台计算机上运行我的测试应用程序,它可能会工作,因为所有内容都在应用程序包中。但这与 dylibs 的目标不矛盾吗?
这是一个link到我查阅过的 Apple 动态库编程文档。
最佳答案
看你的要点
Dylibs need to be inside your app bundle in the Frameworks folder.
不,他们不这样做,他们可以去一个像/Library/Frameworks 这样的公共(public)地方。如果有,它们可以被多个应用程序使用
They need to be linked into your project via the build settings in XCode.
是
Dylibs helps reduce the size of the app compared to static libraries.
这不是文档所说的。它说
Using dynamic libraries instead of static libraries reduces the executable file size of an app.
因此减少了可执行文件(不是应用程序包)的大小。如果您将动态库放在/Library/Frameworks 或类似目录中,然后在两个应用程序之间共享它,那么这些应用程序在磁盘上的总大小将小于您使用静态库的情况。
一般来说,如果您通过 AppStore 或类似应用程序发布并且只运行 .app 并且没有子进程,那么就没有大小优势,但您仍然可以获得延迟加载等的其他好处。但是,如果您确实运行了一个子进程从主应用程序然后你可以在动态库中共享代码,节省内存空间以及在 Apple 的文档中解释。
如果您通过安装程序安装,您可以将框架放置在其他应用程序可以共享和使用的地方。例如如果您有两个应用并且它们有共同的代码,您可以将它们放在一个共享的地方。
关于c++ - OS X 开发和 Dylibs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20425652/