OSX框架链接问题

时间:2011-02-03 17:50:24

标签: xcode macos dylib dyld

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

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

@executable_path/../Frameworks/MyCompany.framework/Versions/A/Resources/lib.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?

谢谢, Ĵ

1 个答案:

答案 0 :(得分:2)

我可以考虑尝试两件事。

选项一

使用@rpath可能更适合您尝试的操作。这里发生的是:

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

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

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

选项二

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

相关问题