如何使用Xcode 4中的动态库文件创建工作框架
我已经在Xcode中创建了一个新的cocoa框架,删除了除了支持文件之外它在开始时包含的所有库和文件 我有两个文件:如何使用Xcode 4中的动态库文件创建工作框架,xcode,macos,frameworks,dylib,Xcode,Macos,Frameworks,Dylib,我已经在Xcode中创建了一个新的cocoa框架,删除了除了支持文件之外它在开始时包含的所有库和文件 我有两个文件: add.h #ifndef add_add_h #define add_add_h void add(void); #endif 及 如何制作一个简单的框架并将动态库文件保存在其中?我认为您误解了错误消息 .framework用作动态库,但在.framework文件夹中不会有任何带有实际.dylib文件扩展名的Mach-O可加载对象文件 在运行时,您可能会从动态链接库加载
add.h
#ifndef add_add_h
#define add_add_h
void add(void);
#endif
及
如何制作一个简单的框架并将动态库文件保存在其中?我认为您误解了错误消息
.framework
用作动态库,但在.framework文件夹中不会有任何带有实际.dylib
文件扩展名的Mach-O可加载对象文件
在运行时,您可能会从动态链接库加载器dyld
获得该错误消息,原因有两个。首先,您忘记了在构建过程中将.frameworks复制到构建的应用程序包中。虽然它们可以复制到应用程序包中的任何位置,但传统的位置是AppName.app/Contents/Frameworks/。如果尚未执行此操作,请选择“项目>新建生成阶段>新建复制文件生成阶段”。将目标弹出窗口更改为下图所示的框架
然后将框架的图标拖到文件夹中,以便在构建过程中复制它
在运行时找不到框架的第二个也是更可能的原因是您没有为主可执行文件指定任何运行路径搜索路径。(这是必需的,因为我们从错误消息中看到,您的框架是使用较新的@rpath/
样式安装名称(@rpath/add.framework/Versions/A/add
)而不是较旧的@executable\u path/
或@loader\u path/
样式构建的)
如果您将自定义框架复制到上述位置,您将添加一个运行路径搜索路径条目@loader\u path/。/frameworks
,如下图所示:
以下摘录解释了如何在运行时找到动态库,摘自dyld
的手册页:
动态库加载
与许多其他操作系统不同,达尔文不定位
依赖动态库通过其叶文件名。而是
使用每个动态库的完整路径(例如。
/usr/lib/libSystem.B.dylib
)。但有时,一个完整的
路径不恰当;例如,您可能希望您的二进制文件
可安装在磁盘上的任何位置。为了支持这一点,有三个方面
@xxx/
可以用作路径前缀的变量。运行时dyld
将动态生成的路径替换为@xxx/
前缀
@executable\u path/
此变量将替换为目录的路径
包含进程的主可执行文件。这对我们来说很有用
正在加载嵌入在.app目录中的dylibs/frameworks。如果
主可执行文件位于/some/path/My.app/Contents/MacOS/My
框架动态库文件位于/some/path/My.app/Contents/Frameworks/Foo.framework/Versions/A/Foo
,
然后,框架加载路径可以编码为
@executable\u path/./Frameworks/Foo.framework/Versions/A/Foo
和
.app目录可能不可用
在文件系统中四处移动,并且仍然可以dyld
加载嵌入式框架
@loader\u path/
此变量将替换为目录的路径
包含mach-o二进制文件,其中包含使用
@loader\u路径
。因此,在每个二进制文件中,@loader_path
解析为
不同的路径,而@executable_path
总是解析为
同一条路@loader\u path
用作
嵌入在插件中的framework/dylib,如果是最终文件系统
插件的位置未知(因此无法使用绝对路径)
或者如果插件被多个应用程序使用(所以
@executable_路径
无法使用)。如果插件mach-o文件位于
/some/path/Myfilter.plugin/Contents/MacOS/Myfilter
和
框架动态库文件位于
/some/path/Myfilter.plugin/Contents/Frameworks/Foo.framework/Versions/A/Foo
,
然后是框架加载路径
可以被编码为
@loader\u path/./Frameworks/Foo.framework/Versions/A/Foo
和
Myfilter.plugin
目录可能是
在文件系统中移动,并且dyld
仍然能够
加载嵌入式框架
@rpath/
Dyld维护一个称为运行路径的当前路径堆栈
列表当遇到@rpath
时,它被替换为
运行路径列表中的路径,直到找到可加载的动态库(如果找到)。这个
运行路径堆栈是根据
导致当前动态库加载的从属链。你可以
使用-RPATH
选项向图像添加LC\u RPATH
load命令
到ld
(1)。您甚至可以添加一个LC\u RPATH
load命令路径
从@loader\u path/
开始,它将在运行时推送一条路径
相对于包含LC\u RPATH
的图像的路径堆栈。
当您有复杂的应用程序时,使用@rpath
最有用
可安装的程序和DYLIB的目录结构
任何地方,但保持他们的相对位置。这种情况
可以使用@loader\u path
实现,但是
dylib可能需要不同的加载路径,因为它是相对的
文件系统中的位置不同。@rpath
引入了一个简化事情的间接层次。你
挑选
add.c
#include <stdio.h>
#include "add.h"
void add(void)
{
printf("adfding");
}
dyld: Library not loaded: @rpath/add.framework/Versions/A/add
Referenced from: /Users/vjoukov/Desktop/Projects/test/build/Debug/test.app/Contents/MacOS/test
Reason: image not found