编译时出现g++未定义的引用错误
g++ undefined reference error on compiling
我正试图在linux上编译我的程序。它在Windows上运行良好(在Visual Studio 2015下编译)。但是当我尝试在Linux上做同样的操作时,我会得到这样的错误:
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
我的#include是:
#include <iostream>
#include <cstring>
#include "Leap.h"
看来问题出在Leap.h头上。在SDK中有一个Sample.cpp,我可以编译它并运行得很好。我使用相同的makefile和相同的文件系统;我使用的#include与Sample.cpp相同,所以我将.cpp文件移到Sample.cpp所在的同一文件夹中,并尝试编译,但我得到了错误。我不知道该怎么解决,有什么想法吗?这是生成文件:
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
我添加CXXFLAGS只是为了解决一个C+98编译器错误。我也可以用这种方式编译Sample.cpp,但当我试图对我的文件执行同样的操作时,我会收到错误。谢谢你的帮助!
看来问题出在Leap.h头上。
不,收割台没有问题。您只是没有链接到提供这些函数定义的库。
看看makefile是如何构建示例程序的:它链接到libleap.so
、
你也需要这样做:
g++ -std=c++0x -std=c++0x Prueba1.cpp -o Prueba1 ../lib/x64/libleap.so -Wl,-rpath,../lib/x64
(如果使用的是32位系统,请将x64替换为x86)。
首先,必读:什么是未定义的引用/未解析的外部符号错误,我该如何修复?请至少阅读与外部库组件相关的答案,然后返回此问题。
好的,所以在您的情况下,您正在运行一个链接命令,而没有指定外部库。为什么?为什么您能够编译软件包附带的示例?
看看makefile。上面写着
Sample: Sample.cpp
$(CXX) -Wall -g -I../include Sample.cpp -o Sample $(LEAP_LIBRARY)
这个规则告诉make
三件事:构建什么(冒号前的第一行),从构建什么(冒号后),以及如何构建(第二行)。所以当你运行这样的命令时
make Sample
make
非常清楚该做什么。
现在如果你说
make Prueba1
事情有点不同。makefile中没有关于Prueba1
的特殊规则,因此make
获取其(巨大的)内置规则集,并寻找一个允许它为您构建Prueba1
的规则。确实有这样一个内置的规则,但它不知道libLeap.so
。这就是为什么您在构建日志中看不到它的原因。
当然,你可以在你的makefile中添加这样的东西:
Prueba1: Prueba1.cpp
$(CXX) -Wall -g -I../include Prueba1.cpp -o Prueba1 $(LEAP_LIBRARY)
但我大胆猜测,当你到达Prueba99时,它会变得有些老。我们能做得更好吗?
是的,我们可以,但让我们先回答另一个问题。为什么您的编译命令知道-std=c++0x
?
这是因为您将此标志添加到内置宏CXXFLAGS
中,而内置规则使用此宏。顺便说一下,您不需要指定-std=c++0x
两次。
有没有一种方法可以像对待编译器标志一样对待库?绝对地有两个内置的宏LDLIBS
和LDFLAGS
。如果你这样定义它们:
LDLIBS := ../lib/x64/libLeap.so
LDFLAGS := -Wl,-rpath,../lib/x64
或(可选)
LDLIBS := -lLeap
LDFLAGS := -L ../lib/x64 -Wl,-rpath,../lib/x64
您的makefile应该能够针对libLeap构建任何C++程序(如果它是作为单个C++源文件编写的)。
将-I../include
添加到CPPFLAGS
可能是明智的,因为Sample规则使用了它。您的编译似乎在没有它的情况下可以工作,但如果您更改工作目录,它可能会失败。
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++引用错误
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 只有级联分类器会发出未定义的引用错误
- 2个模板化类的非模板友元函数未定义引用错误
- C/C++ 取消引用错误:在空检查之前取消引用
- 为什么我的C++代码无法编译,出现未定义的引用错误
- 我的代码中C++未定义的引用错误?
- 模板专用化会导致未定义的引用错误
- .cpp文件中未定义的引用错误
- c++ 中目录中文件的未定义引用错误
- Opencv4 使用 pkg-config 给出未定义的引用错误
- 使用Cygwin C++时出现未定义的引用错误,为什么我的文件没有链接?
- 共享指针取消引用错误
- 编译简单的多文件类程序时出现未定义的引用错误
- 模板函数产生未定义的引用错误
- 调用提取重加载器会产生对"运算符"的未定义引用错误>>
- 如何修复"未定义的引用"错误 opencv 和 g++
- 未定义的引用错误,我该怎么办?