【发布时间】: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