在Xcode中运行已编译的可执行文件会产生与直接调用shell中的可执行文件不同的结果

时间:2014-10-27 09:25:37

标签: c++ xcode linker build-process openscenegraph

该程序使用OpenSceneGraph生成.osg文件。

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().



但是,编译后的二进制文件可以通过直接在shell中运行来执行无错误。(。/ program)并且程序正确生成Simple .osg文件。


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

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

2 个答案:

答案 0 :(得分:0)

这只是一个shell的PATH在shell和Xcode中不同的问题。

很多时候,IDE会让您指定在可执行运行时使用的PATH。确保它包含普通shell所具有的所有重要条目。

答案 1 :(得分:0)

行。几个小时后我终于解决了。
库在shell下加载的原因是由于〜/ .profile中shell的默认环境变量设置,因此程序可以使用这些变量搜索库。
正如XenonofArcticus指出的那样,xcode不会继承〜/ .profile中的环境变量设置,因此在xcode下运行的程序无法解析库的实际路径。
但是,首先我将这些变量复制到xcode中的环境变量设置中,但它没有起作用。
事实证明,xcode中的环境变量设置不能在不同的环境中扩展。例如:

HELLO=123/hi
WORLD=$HELLO/enter

第二个WORLD变量不会将之前定义的HELLO替换为路径。
因此,我需要像这样手动编写:

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