2

我正在尝试编译运行下面给出的一个非常基本的程序(test.cpp),它调用 OpenNI 类。您可以在此处查看它们所在的文件和目录。抱歉,有些字符在浏览器的编码中有点搞砸了。我正在使用 linux 命令:tree,如果您知道更好的命令,请告诉我,我会更新它。

文件结构

我在这里遵循指南,请参阅“GCC / GNU Make”。

#include < stdio.h > 
#include < OpenNI.h > 

using namespace openni; 

int 
main ( void ) 
{ 
    Status rc = OpenNI::initialize(); 

    if (rc != STATUS_OK) 
    { 
        printf("\nInitialize failed\n%s\n", OpenNI::getExtendedError()); 
        return 1; 
    } 

    printf("Hello, world!\n"); 
    return 0; 
} 

这是我在命令行中运行的编译它(gcc 4.7.2):

gcc test.cpp -I../OpenNI-2.0.0/Include -L/home/evan/Code/OpenNi/Init -l OpenNI2 -o test 

这工作正常,但是当我运行 ./test 时,我收到以下错误:

Initialize failed 
DeviceDriver: library handle is invalid for file libOniFile.so 
Couldn't understand file 'libOniFile.so' as a device driver 
DeviceDriver: library handle is invalid for file libPS1080.so 
Couldn't understand file 'libPS1080.so' as a device driver 
Found no valid drivers in './OpenNI2/Drivers' 

谢谢,任何帮助将不胜感激。

4

2 回答 2

1

导游的指示说,

强烈建议将“-Wl,-rpath ./”添加到您的链接命令中。否则,运行应用程序时,运行时链接器将找不到 libOpenNI.so 文件。(默认的 Linux 行为是仅在 /lib 和 /usr/lib 中查找共享对象)。

看来您确实遇到了这个问题——它找不到一些库。尝试将正确的 rpath(在您的情况下似乎是 /home/evan/Code/OpenNi/Init/OpenNI2/Drivers )添加到您的编译字符串中。

于 2013-01-18T08:27:46.843 回答
1

在用 Eclipse 编译这个小小的“Hello World”并尝试在命令行中运行它之后,我遇到了同样的问题。“Wl,-rpath=./”对我不起作用。正如这里所讨论的,它在设置一些环境后对我有用。执行前的变量:

export LD_LIBRARY_PATH="/path/to/OpenNI2:$LD_LIBRARY_PATH"
export OPENNI2_DRIVERS_PATH="/path/to/OpenNI2/Drivers"
export LD_LIBRARY_PATH="/path/to/OpenNI2/Drivers:$LD_LIBRARY_PATH"

在某个地方,我得到了前两行应该足够的信息,但第三行很重要。我也只使用第三行。

于 2015-04-17T07:47:06.967 回答