【问题标题】:OSX framework linking issuesOSX 框架链接问题
【发布时间】:2011-06-20 20:31:23
【问题描述】:

我正在为 OSX 10.6 开发一个私有框架,其中包括一些命令行工具以及一些 dylib。现在,dylib 需要相互链接,命令行工具需要链接 dylib。

命令行工具和 .dylib 位于框架包内的 Resources 文件夹中。我使用install_name_tool 更新所有路径:

@executable_path/../Frameworks/MyCompany.framework/Versions/A/Resources/lib.dylib

现在,当应用程序使用所有 dylib 时,所有 dylib 都可以正确加载,但运行时命令行工具在运行时失败并显示 dyld: Library not loaded,如下所示:

// dylibpath is an NSString set the the path of the Resources folder within the framework

NSTask *task = [[[NSTask alloc]init]autorelease];
[task setEnvironment:[NSDictionary dictionaryWithObjectsAndKeys:@"DYLD_LIBRARY_PATH", dylibPath, nil]];
[task setLaunchPath:binConvert];
[task launch];
[task waitUntilExit];

现在,我来自 Windows 背景,如果 DLL 与应用程序位于同一文件夹中,加载程序会找到它们,但显然 OSX 会寻找完整路径。如何获取命令行工具来查找同一文件夹中的 dylib?

谢谢, J

【问题讨论】:

    标签: xcode macos dylib dyld


    【解决方案1】:

    有两件事我可以尝试。

    选项一

    使用@rpath 可能更适合您正在尝试做的事情。这里发生的事情是这样的:

    您的库都希望它们相对于任何可执行文件的定位相同。他们都将在:

    @executable_path/../Frameworks/MyCompany.framework/Versions/A/Resources/lib.dylib
    

    只要您将所有库放在相对于可执行文件的正确位置,您就可以使用它。相反,您可以将 dylibs 上的安装名称(通过install_name_tool)设置为@rpath/lib.dylib。这应该与DYLD_LIBRARY_PATH 环境变量一起使用,但它确实适合与-rpath 编译器标志一起使用,所以这可能有效,但我从未尝试过。

    选项二

    您还可以创建符号链接,以便通过从可执行文件遍历到您设置为安装名称的路径来实际找到该库。

    【讨论】:

    • 感谢您的输入,我认为符号链接方法将成为解决此问题的方法。最后一件事我不确定 - 如果我正在更新链接库的路径以使用与调用库相同目录中的符号链接,我应该将 dylib 'id' 设置为什么?我仍然不确定这个 ID 是做什么用的,我相信它是安装路径?
    • 我想我应该问的是有没有@blah_path 可以解析到框架根目录?我已经创建了一些符号链接并将 dylib 链接到它们,但我仍然遇到路径处于不同级别的问题,因此当 dylib 尝试加载另一个 dylib 时,路径中有太多 '../' 并且失败再次。
    • 您可以尝试使用 @rpath/libs/lib.dylib 的安装名称来安装所有内容。任何使用这些库的库/可执行文件只需要在链接到包含所有库的目录的同一目录中的符号链接。
    • 最后,我在与调用可执行文件相同的路径中创建了指向 libs 文件夹的符号链接,并将 @loader_path/libs/lib.dylib 用于所有内容,并且它可以正常工作!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 2015-08-08
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多