2014-10-27 21 views
0

该程序使用OpenSceneGraph生成.osg文件。在Xcode中运行已编译的可执行文件给出了直接调用shell中的可执行文件的不同结果

int main(int, char**) 
{ 
    osg::ref_ptr<osg::Node> root = createSceneGraph(); 
    if (!root.valid()) 
    { 
     osg::notify(osg::FATAL) << "Failed in createSceneGraph()." << endl; 
    } 
    bool result = osgDB::writeNodeFile(*(root.get()), "Simple.osg"); 
    if (!result) 
    { 
     osg::notify(osg::FATAL) << "Failed in osgDB::writeNode()." << endl; 
    } 
} 

代码摘录来自OpenSceneGraph的快速入门指南http://www.lulu.com/items/volume_51/767000/767629/3/print/OSGQSG.pdf 第40页

该程序可以编译和运行的XCode。 但是,它示出了以下错误:

Error writing file Simple.osg: Warning: Could not find plugin to 
write nodes to file "Simple.osg". 
Failed in osgDB::writeNode(). 



然而,编译的二进制可通过在将该罩体直接运行被执行无错误(./程序)以及该程序。正确地生成Simple.osg文件。


这不是故事的结束。这很可能是因为xcode调用编译程序与在shell中调用它不同。因此,我将两个依赖库复制并粘贴到编译二进制文件所在的目录中。
(在谁知道OSG的情况下,这两个库是osgdb_deprecated_osg.so和osgdb_osg.so)

这个时候,Xcode的正常运行没有错误的程序,生成Simple.osg文件。
因此,有两个问题。
1)为什么shell能够自动定位依赖库而Xcode不能?
2)如何使无需手动复制依赖库或通过邮寄编译复印选项的Xcode工作?

回答

0

好的。几个小时后,我终于解决了。
在shell下加载库的原因是由于shell在〜/ .profile中的默认环境变量设置,因此程序可以使用这些变量搜索库。
作为XenonofArcticus指出,Xcode中不会在〜/ .profile文件,以便在Xcode的运行程序不能解决实际库的路径继承设置的环境变量。
但是,起初我将这些变量复制到xcode中的环境变量设置中,但它不起作用。
事实证明,xcode中的环境变量设置不能跨不同的扩展。即G:

HELLO=123/hi 
WORLD=$HELLO/enter 

第二届世界变量不替换先前定义的进入路径的HELLO。
因此,我需要手工编写这样的:

HELLO=123/hi 
WORLD=123/hi/enter 
0

这是一个简单的shell路径是在外壳和Xcode中不同的问题。

很多时候IDE会允许您指定PATH在可执行运行时正在使用的时间。确保它包含所有正常shell的重要条目。

+0

你能否详细说明如何在Xcode定制路径?我尝试编辑scheme-> arguments->环境变量,并将PATH和其他环境变量设置为与我为shell设置的完全相同,但仍然没有骰子。 – user2127480 2014-10-27 18:05:53

相关问题