简体   繁体   中英

g++ undefined reference error on compiling

Im trying to compile my program on linux. It works great on Windows (compiled under Visual Studio 2015). But when I try to do the same on Linux, I get this error:

g++ -std=c++0x -std=c++0x    Prueba1.cpp   -o Prueba1
/tmp/cc9HTgYi.o: In function `Escuchador::onFrame(Leap::Controller const&)':
Prueba1.cpp:(.text+0x51): undefined reference to `Leap::Controller::frame(int) const'
Prueba1.cpp:(.text+0x6c): undefined reference to `Leap::Frame::fingers() const'
Prueba1.cpp:(.text+0x7d): undefined reference to `Leap::FingerList::count() const'
Prueba1.cpp:(.text+0x97): undefined reference to `Leap::Frame::hands() const'
Prueba1.cpp:(.text+0xa8): undefined reference to `Leap::HandList::count() const'
Prueba1.cpp:(.text+0xbc): undefined reference to `Leap::Frame::timestamp() const'
Prueba1.cpp:(.text+0xce): undefined reference to `Leap::Frame::id() const'
Prueba1.cpp:(.text+0x1ac): undefined reference to `Leap::Frame::hands() const'
Prueba1.cpp:(.text+0x1c7): undefined reference to `Leap::HandList::begin() const'
Prueba1.cpp:(.text+0x203): undefined reference to `Leap::Hand::isLeft() const'
Prueba1.cpp:(.text+0x245): undefined reference to `Leap::Hand::id() const'
Prueba1.cpp:(.text+0x2fc): undefined reference to `Leap::Hand::palmNormal() const'
Prueba1.cpp:(.text+0x317): undefined reference to `Leap::Hand::direction() const'
Prueba1.cpp:(.text+0x332): undefined reference to `Leap::Hand::fingers() const'
Prueba1.cpp:(.text+0x34d): undefined reference to `Leap::FingerList::begin() const'
Prueba1.cpp:(.text+0x37e): undefined reference to `Leap::Pointable::id() const'
Prueba1.cpp:(.text+0x38e): undefined reference to `Leap::Finger::type() const'
Prueba1.cpp:(.text+0x47b): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x510): undefined reference to `Leap::Frame::hands() const'
Prueba1.cpp:(.text+0x533): undefined reference to `Leap::HandList::operator[](int) const'
Prueba1.cpp:(.text+0x54e): undefined reference to `Leap::Hand::fingers() const'
Prueba1.cpp:(.text+0x582): undefined reference to `Leap::FingerList::begin() const'
Prueba1.cpp:(.text+0x595): undefined reference to `Leap::Bone::Bone()'
Prueba1.cpp:(.text+0x5ea): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x63e): undefined reference to `Leap::Finger::type() const'
Prueba1.cpp:(.text+0x67f): undefined reference to `Leap::operator<<(std::ostream&, Leap::Bone const&)'
Prueba1.cpp:(.text+0x6ee): undefined reference to `Leap::FingerList::end() const'
Prueba1.cpp:(.text+0x726): undefined reference to `Leap::Hand::fingers() const'
Prueba1.cpp:(.text+0x74d): undefined reference to `Leap::FingerList::begin() const'
Prueba1.cpp:(.text+0x768): undefined reference to `Leap::FingerList::end() const'
Prueba1.cpp:(.text+0x7ab): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x7ce): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x7f1): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x814): undefined reference to `Leap::Finger::bone(Leap::Bone::Type) const'
Prueba1.cpp:(.text+0x825): undefined reference to `Leap::Finger::type() const'
Prueba1.cpp:(.text+0x848): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0x863): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0x89e): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0x8b9): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0x8f4): undefined reference to `Leap::Bone::direction() const'
/tmp/cc9HTgYi.o:Prueba1.cpp:(.text+0x90c): more undefined references to `Leap::Bone::direction() const' follow
/tmp/cc9HTgYi.o: In function `Escuchador::onFrame(Leap::Controller const&)':
Prueba1.cpp:(.text+0xa15): undefined reference to `Leap::Finger::type() const'
Prueba1.cpp:(.text+0xa37): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xa4f): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xa87): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xa9f): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xad7): undefined reference to `Leap::Bone::direction() const'
/tmp/cc9HTgYi.o:Prueba1.cpp:(.text+0xaef): more undefined references to `Leap::Bone::direction() const' follow
/tmp/cc9HTgYi.o: In function `Escuchador::onFrame(Leap::Controller const&)':
Prueba1.cpp:(.text+0xbf8): undefined reference to `Leap::Finger::type() const'
Prueba1.cpp:(.text+0xc1b): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xc33): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xc6b): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xc83): undefined reference to `Leap::Bone::direction() const'
Prueba1.cpp:(.text+0xcbb): undefined reference to `Leap::Bone::direction() const'
/tmp/cc9HTgYi.o:Prueba1.cpp:(.text+0xcd3): more undefined references to `Leap::Bone::direction() const' follow
/tmp/cc9HTgYi.o: In function `Escuchador::onFrame(Leap::Controller const&)':
Prueba1.cpp:(.text+0xeb4): undefined reference to `Leap::FingerList::end() const'
Prueba1.cpp:(.text+0xf27): undefined reference to `Leap::HandList::end() const'
/tmp/cc9HTgYi.o: In function `main':
Prueba1.cpp:(.text+0x11a3): undefined reference to `Leap::Controller::Controller()'
Prueba1.cpp:(.text+0x11b7): undefined reference to `Leap::Controller::addListener(Leap::Listener&)'
Prueba1.cpp:(.text+0x11fb): undefined reference to `Leap::Controller::removeListener(Leap::Listener&)'
Prueba1.cpp:(.text+0x120c): undefined reference to `Leap::Controller::~Controller()'
Prueba1.cpp:(.text+0x122a): undefined reference to `Leap::Controller::~Controller()'
/tmp/cc9HTgYi.o: In function `Leap::Pointable::~Pointable()':
Prueba1.cpp:(.text._ZN4Leap9PointableD2Ev[_ZN4Leap9PointableD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o: In function `Leap::Bone::operator=(Leap::Bone&&)':
Prueba1.cpp:(.text._ZN4Leap4BoneaSEOS0_[_ZN4Leap4BoneaSEOS0_]+0x14): undefined reference to `Leap::Interface::operator=(Leap::Interface const&)'
/tmp/cc9HTgYi.o: In function `Leap::ConstListIterator<Leap::HandList, Leap::Hand>::operator*() const':
Prueba1.cpp:(.text._ZNK4Leap17ConstListIteratorINS_8HandListENS_4HandEEdeEv[_ZNK4Leap17ConstListIteratorINS_8HandListENS_4HandEEdeEv]+0x20): undefined reference to `Leap::HandList::operator[](int) const'
/tmp/cc9HTgYi.o: In function `Leap::ConstListIterator<Leap::FingerList, Leap::Finger>::operator*() const':
Prueba1.cpp:(.text._ZNK4Leap17ConstListIteratorINS_10FingerListENS_6FingerEEdeEv[_ZNK4Leap17ConstListIteratorINS_10FingerListENS_6FingerEEdeEv]+0x20): undefined reference to `Leap::FingerList::operator[](int) const'
/tmp/cc9HTgYi.o: In function `Leap::Frame::~Frame()':
Prueba1.cpp:(.text._ZN4Leap5FrameD2Ev[_ZN4Leap5FrameD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o: In function `Leap::HandList::~HandList()':
Prueba1.cpp:(.text._ZN4Leap8HandListD2Ev[_ZN4Leap8HandListD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o: In function `Leap::FingerList::~FingerList()':
Prueba1.cpp:(.text._ZN4Leap10FingerListD2Ev[_ZN4Leap10FingerListD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o: In function `Leap::Hand::~Hand()':
Prueba1.cpp:(.text._ZN4Leap4HandD2Ev[_ZN4Leap4HandD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o: In function `Leap::Bone::~Bone()':
Prueba1.cpp:(.text._ZN4Leap4BoneD2Ev[_ZN4Leap4BoneD5Ev]+0x16): undefined reference to `Leap::Interface::~Interface()'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap5FrameE[_ZTIN4Leap5FrameE]+0x8): undefined reference to `typeinfo for Leap::Interface'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap8HandListE[_ZTIN4Leap8HandListE]+0x8): undefined reference to `typeinfo for Leap::Interface'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap10FingerListE[_ZTIN4Leap10FingerListE]+0x8): undefined reference to `typeinfo for Leap::Interface'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap4HandE[_ZTIN4Leap4HandE]+0x8): undefined reference to `typeinfo for Leap::Interface'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap4BoneE[_ZTIN4Leap4BoneE]+0x8): undefined reference to `typeinfo for Leap::Interface'
/tmp/cc9HTgYi.o:(.rodata._ZTIN4Leap9PointableE[_ZTIN4Leap9PointableE]+0x8): more undefined references to `typeinfo for Leap::Interface' follow
collect2: error: ld returned 1 exit status
make: *** [Prueba1] Error 1

My #include are:

#include <iostream>
#include <cstring>
#include "Leap.h"

So it seems the problem is with the Leap.h header. In the SDK there is a Sample.cpp that I can compile and runs great. Im using the same makefile and the same filesystem; I am using the same #include than the Sample.cpp, so I move my .cpp file into the same folder the Sample.cpp is and try to compile, and I get the error. I dont know how to solve it, any ideas? Here is the makefile:

OS := $(shell uname)
ARCH := $(shell uname -m)
CXXFLAGS := -std=c++0x -std=c++0x

ifeq ($(OS), Linux)
  ifeq ($(ARCH), x86_64)
LEAP_LIBRARY := ../lib/x64/libLeap.so -Wl,-rpath,../lib/x64
  else
LEAP_LIBRARY := ../lib/x86/libLeap.so -Wl,-rpath,../lib/x86
  endif
else
  # OS X
LEAP_LIBRARY := ../lib/libLeap.dylib
endif

Sample: Sample.cpp
$(CXX) -Wall  -g -I../include Sample.cpp -o Sample $(LEAP_LIBRARY)

ifeq ($(OS), Darwin)
install_name_tool -change @loader_path/libLeap.dylib ../lib/libLeap.dylib Sample
endif

clean:
rm -rf Sample Sample.dSYM

I only added the CXXFLAGS to solve a C+98 compiler error. I can compile the Sample.cpp this way too, but when I try to do the same on my file, I get the errors. Thanks for the help!

So it seems the problem is with the Leap.h header.

No, there's no problem with the header. You're simply not linking to the library that provides the definitions of those functions.

Look at how the makefile builds the sample program: it links to libleap.so ,

You need to do the same:

g++ -std=c++0x -std=c++0x    Prueba1.cpp   -o Prueba1 ../lib/x64/libleap.so -Wl,-rpath,../lib/x64

(replacing x64 with x86 if you're on a 32-bit system).

First, required reading: What is an undefined reference/unresolved external symbol error and how do I fix it? Please read at least answers related to external library components, then return to this question.


OK so in your case you are running a link command without specifying the external library. How come? Why are you able to compile a sample that comes with the package?

Take a look at the makefile. It says

Sample: Sample.cpp
    $(CXX) -Wall  -g -I../include Sample.cpp -o Sample $(LEAP_LIBRARY)

This rule tells make three things: what to build (the first line before the colon), what to build it from (after the colon), and how to build it (the second line). So when you run a command like

make Sample

make has a pretty good idea what to do.

Now if you say

make Prueba1

things are a bit different. There are no special rules in the makefile that talk about Prueba1 , so make fetches its (huge) set of built-in rules and looks for one that would allow it to build Prueba1 for you. There is indeed such a built-in rule, but it doesn't know about libLeap.so . This is why you don't see it in your build log.

Of course you can add something like this to your makefile:

Prueba1: Prueba1.cpp
    $(CXX) -Wall  -g -I../include Prueba1.cpp -o Prueba1 $(LEAP_LIBRARY)

but I'd venture to guess that it will grow somewhat old when you get to Prueba99. Can we do better?

Yes we can, but let's answer another question first. How come your compilation command knows about -std=c++0x ?

This is because you added this flag to a built-in macro CXXFLAGS , and the built-in rule uses this macro. By the way you don't need to specify -std=c++0x twice.

Is there a way to treat the libraries similarly to compiler flags? Absolutely! There are two built in macros LDLIBS and LDFLAGS . If you define them this way:

LDLIBS := ../lib/x64/libLeap.so
LDFLAGS := -Wl,-rpath,../lib/x64

or (alternatively)

LDLIBS := -lLeap
LDFLAGS := -L ../lib/x64 -Wl,-rpath,../lib/x64

your makefile should be able to build any C++ program against libLeap (if it is written as a single C++ source file).

It is probably wise to add -I../include to CPPFLAGS since the Sample rule uses it. Your compilation seems to work without it but it may fail if you eg change your working directory.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM