1

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

命令行工具和 .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?

谢谢,J

4

1 回答 1

2

有两件事我可以考虑尝试。

选项一

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

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

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

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

选项二

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

于 2011-02-03T18:34:36.623 回答