C++ 在Xcode中运行编译后的可执行文件与在shell中直接调用可执行文件的结果不同

C++ 在Xcode中运行编译后的可执行文件与在shell中直接调用可执行文件的结果不同,c++,xcode,linker,build-process,openscenegraph,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 r

该程序使用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;
    }
}


然而,编译后的二进制文件可以通过直接在shell中运行而无误地执行(/program),程序正确地生成Simple.osg文件


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

这一次,Xcode正确地运行程序而没有错误,生成Simple.osg文件。
因此,有两个问题。
1)为什么shell能够自动定位相关库,而Xcode不能?

2)如何在不手动复制依赖库或通过编译后复制选项的情况下使Xcode工作?

这只是shell和Xcode中的shell路径不同的问题


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

确定。几个小时后,我终于把它解决了。
在shell下加载库的原因是~/.profile中shell的默认环境变量设置,因此程序可以使用这些变量搜索库。
正如XenonOfarcicus指出的,xcode不继承~/.profile中的环境变量设置,因此在xcode下运行的程序无法解析库的实际路径。
然而,起初我在xcode中的环境变量设置中复制了这些变量,但没有成功。
事实证明,xcode中的环境变量设置不能跨不同的环境变量进行扩展。e、 g:

HELLO=123/hi
WORLD=$HELLO/enter
第二个世界变量不会将先前定义的HELLO替换到路径中
因此,我需要像这样手动编写:

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

您能详细介绍一下如何在Xcode中自定义路径吗?我尝试编辑scheme->arguments->environmental variable,并将路径和其他环境变量设置为与我为shell设置的完全相同,但仍然没有骰子。
HELLO=123/hi
WORLD=123/hi/enter