- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个简单的控制台应用程序,旨在从一个更大的项目中运行一个库。控制台应用程序是 XCode 项目中的一个目标,该项目还包含该库(加上我现在不关心的其他一些目标)。控制台目标通过在构建阶段“目标依赖项”和“将二进制文件与库链接”中列出来引用库。
通过单击“运行”按钮并检查“所有输出”下的控制台输出,我可以在 XCode 中正常运行控制台程序。
但是,如果我尝试在 XCode 之外运行,则会出现加载错误。我在项目导航器中选择“产品”下的控制台应用程序,然后在信息面板的“身份”部分找到“完整路径”。当我将此路径复制到终端窗口并运行它时,出现如下错误:
dyld: Library not loaded:
@executable_path/../Frameworks/[LIBRARY].framework/Versions/A/[LIBRARY]
Referenced from: [THE PATH THAT I TYPED]
Reason: image not found
我应该采取哪些不同的措施来让我的控制台应用程序从控制台执行?
(请注意,在“复制文件”阶段,我尝试将“子路径”留空并将其设置为“@executable_path/../Frameworks”每this answer,这是关于一个 cocoa 应用程序,但两者都不是方式有所帮助。)
最佳答案
正如上面的评论者所解释的,dyld 是动态加载器,它正在它打印的路径中寻找我的库。 (当它说 @executable_path
时,它表示我实际尝试运行的控制台应用程序的位置。)
查看 XCode 的编译输出,我看到如下文件夹层次结构:
Debug/
MyProgram
Frameworks/[LIBRARY].framework/Versions/A/[LIBRARY]
无论出于何种原因,此结构都不符合加载器的要求——它正在 ../Frameworks
而不是 ./Frameworks
寻找库。
我没有弄乱加载程序使用的环境变量或尝试调整程序本身,而是将这些文件复制到一个新文件夹,其结构在错误消息中指定:
foo/
bin/MyProgram
Frameworks/[LIBRARY].framework/Versions/A/[LIBRARY]
我现在可以毫无问题地从终端运行 foo/bin/MyProgram
。
关于objective-c - 如何在 xcode 之外运行 objective-c 控制台应用程序(带有库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17935327/
我是一名优秀的程序员,十分优秀!