【问题标题】:OpenNI linking erros, lots of undefined referencesOpenNI 链接错误,大量未定义的引用
【发布时间】:2016-07-27 05:31:45
【问题描述】:

我快疯了.... 我正在开发一个程序,用 OpenNI 和 NiTE 从 Xtion Primesense 传感器读取关节坐标。我把程序分成 3 个部分。主要,sensorOpenNI.hpp 和 sensorOpenNI.cpp。现在,在将这些部分链接在一起时,我收到很多错误,说对某些 NiTE 函数有未定义的引用。我正在使用 Kubuntu 和 g++。 NiTE 和 OpenNI 库位于名为 Include... 的目录中 这是错误消息:

/tmp/ccrPQHEg.o:在函数openni::VideoFrameRef::release()': sensorOpenNI.cpp:(.text._ZN6openni13VideoFrameRef7releaseEv[openni::VideoFrameRef::release()]+0x18): undefined reference tooniFrameRelease' /tmp/ccrPQHEg.o:在函数openni::VideoFrameRef::_setFrame(OniFrame*)': sensorOpenNI.cpp:(.text._ZN6openni13VideoFrameRef9_setFrameEP8OniFrame[openni::VideoFrameRef::_setFrame(OniFrame*)]+0x25): undefined reference tooniFrameAddRef' /tmp/ccrPQHEg.o:在函数nite::UserTrackerFrameRef::release()': sensorOpenNI.cpp:(.text._ZN4nite19UserTrackerFrameRef7releaseEv[nite::UserTrackerFrameRef::release()]+0x24): undefined reference toniteUserTrackerFrameRelease' /tmp/ccrPQHEg.o:在函数nite::UserTracker::create(openni::Device*)': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker6createEPN6openni6DeviceE[nite::UserTracker::create(openni::Device*)]+0x13): undefined reference toniteInitializeUserTracker' sensorOpenNI.cpp:(.text._ZN4nite11UserTracker6createEPN6openni6DeviceE[nite::UserTracker::create(openni::Device*)]+0x27): 未定义引用niteInitializeUserTrackerByDevice' /tmp/ccrPQHEg.o: In functionnite::UserTracker::destroy()': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker7destroyEv[nite::UserTracker::destroy()]+0x1e): 对niteShutdownUserTracker' /tmp/ccrPQHEg.o: In functionnite::UserTracker::readFrame(nite::UserTrackerFrameRef*)'的未定义引用: sensorOpenNI.cpp:(.text._ZN4nite11UserTracker9readFrameEPNS_19UserTrackerFrameRefE[nite::UserTracker::readFrame(nite::UserTrackerFrameRef*)]+0x1d): 未定义引用niteReadUserTrackerFrame' /tmp/ccrPQHEg.o: In functionnite::UserTracker::startSkeletonTracking(short)': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker21startSkeletonTrackingEs[nite::UserTracker::startSkeletonTracking(short)]+0x1e): 未定义引用niteStartSkeletonTracking' /tmp/ccrPQHEg.o: In functionnite::NiTE::initialize()': sensorOpenNI.cpp:(.text._ZN4nite4NiTE10initializeEv[nite::NiTE::initialize()]+0x7): 未定义引用niteInitialize' collect2: ld returned 1 exit status patrick@ubuntu:~/Koerpersteuerung$ g++ -c sensorOpenNI.cpp sensorOpenNI.hpp -I Include/ patrick@ubuntu:~/Koerpersteuerung$ g++ mainSensor.cpp sensorOpenNI.o -I Include/ sensorOpenNI.o: In functionopenni::VideoFrameRef::release()': sensorOpenNI.cpp:(.text._ZN6openni13VideoFrameRef7releaseEv[openni::VideoFrameRef::release()]+0x18): 未定义引用oniFrameRelease' sensorOpenNI.o: In functionopenni::VideoFrameRef::_setFrame(OniFrame*)': sensorOpenNI.cpp:(.text._ZN6openni13VideoFrameRef9_setFrameEP8OniFrame[openni::VideoFrameRef::_setFrame(OniFrame*)]+0x25): 未定义引用oniFrameAddRef' sensorOpenNI.o: In functionnite::UserTrackerFrameRef::release()': sensorOpenNI.cpp:(.text._ZN4nite19UserTrackerFrameRef7releaseEv[nite::UserTrackerFrameRef::release()]+0x24): 对niteUserTrackerFrameRelease' sensorOpenNI.o: In functionnite::UserTracker::create(openni::Device*)'的未定义引用: sensorOpenNI.cpp:(.text._ZN4nite11UserTracker6createEPN6openni6DeviceE[nite::UserTracker::create(openni::Device*)]+0x13):未定义引用niteInitializeUserTracker' sensorOpenNI.cpp:(.text._ZN4nite11UserTracker6createEPN6openni6DeviceE[nite::UserTracker::create(openni::Device*)]+0x27): undefined reference toniteInitializeUserTrackerByDevice' sensorOpenNI.o:在函数nite::UserTracker::destroy()': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker7destroyEv[nite::UserTracker::destroy()]+0x1e): undefined reference toniteShutdownUserTracker' sensorOpenNI.o:在函数nite::UserTracker::readFrame(nite::UserTrackerFrameRef*)': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker9readFrameEPNS_19UserTrackerFrameRefE[nite::UserTracker::readFrame(nite::UserTrackerFrameRef*)]+0x1d): undefined reference toniteReadUserTrackerFrame' sensorOpenNI.o:在函数nite::UserTracker::startSkeletonTracking(short)': sensorOpenNI.cpp:(.text._ZN4nite11UserTracker21startSkeletonTrackingEs[nite::UserTracker::startSkeletonTracking(short)]+0x1e): undefined reference toniteStartSkeletonTracking' sensorOpenNI.o:在函数nite::NiTE::initialize()': sensorOpenNI.cpp:(.text._ZN4nite4NiTE10initializeEv[nite::NiTE::initialize()]+0x7): undefined reference toniteInitialize' collect2: ld 返回 1 个退出状态

我这样调用 g++:

g++ -o test mainSensor.cpp sensorOpenNI.cpp -I Include/

【问题讨论】:

  • 一般情况下,includes 和 libs 应该位于不同的目录中(例如 /usr/local/include/usr/local/lib)。您正在调用 g++ 并传递 -I 但您没有链接到任何库(-L 标志)
  • 感谢您的评论,在再次查看示例及其 Makefile 后,我意识到这一点。是否有可能显示所有依赖项?
  • 不确定,但你可以试试g++ -o test mainSensor.cpp sensorOpenNI.cpp `pkg-config openni --cflags --libs`
  • 谢谢,今晚我会测试一下,我还没有 pkg​​-config
  • 对 c++ 没有经验,我也不使用 linux,但最近有机会简单地使用 pkg-config 和 opencv,它运行良好。我希望它也适用于 openni/nite

标签: c++ openni


【解决方案1】:

尝试像这样复制库 libOpenNI2.so 和 libNiTE2:

sudo cp ./OpenNI-Linux-x86-2.2/Redist/libOpenNI2.so /usr/local/lib 
sudo cp ./NiTE-Linux-x86-2.2/Redist/libNiTE2.so /usr/local/lib

然后做 须藤 ldconfig 现在通过添加 -lOpenNI2 -lNiTE2

来编译程序

【讨论】:

    猜你喜欢
    • 2015-01-23
    • 2014-04-21
    • 2013-03-15
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    相关资源
    最近更新 更多