Undefined symbols for architecture x86_64
Issue #363
resolved
When compiling this simple test application on macOS 10.12.6
#include <x265.h>
#include <stdint.h>
long check_x265_api_get(void)
{
return (long) x265_api_get;
}
int main(void)
{
int ret = 0;
ret |= ((intptr_t)check_x265_api_get) & 0xFFFF;
return ret;
}
with
gcc -Ix265-2.5/include -Lx265-2.5/lib -lx265 -o bug bug.c
I get
Undefined symbols for architecture x86_64:
"vtable for __cxxabiv1::__class_type_info", referenced from:
typeinfo for x265::SyntaxElementWriter in libx265.a(encoder.cpp.o)
typeinfo for x265::BitInterface in libx265.a(bitstream.cpp.o)
typeinfo for x265::SyntaxElementWriter in libx265.a(ratecontrol.cpp.o)
typeinfo for x265::JobProvider in libx265.a(frameencoder.cpp.o)
typeinfo for x265::BondedTaskGroup in libx265.a(frameencoder.cpp.o)
typeinfo for x265::SyntaxElementWriter in libx265.a(frameencoder.cpp.o)
typeinfo for x265::BitInterface in libx265.a(frameencoder.cpp.o)
...
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for __cxxabiv1::__si_class_type_info", referenced from:
typeinfo for x265::SEIContentLightLevel in libx265.a(encoder.cpp.o)
typeinfo for x265::SEIMasteringDisplayColorVolume in libx265.a(encoder.cpp.o)
typeinfo for x265::SEIuserDataUnregistered in libx265.a(encoder.cpp.o)
typeinfo for x265::SEIActiveParameterSets in libx265.a(encoder.cpp.o)
typeinfo for x265::Bitstream in libx265.a(bitstream.cpp.o)
typeinfo for x265::WorkerThread in libx265.a(threadpool.cpp.o)
typeinfo for x265::SEIBufferingPeriod in libx265.a(ratecontrol.cpp.o)
...
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for __cxxabiv1::__vmi_class_type_info", referenced from:
typeinfo for x265::SEI in libx265.a(encoder.cpp.o)
typeinfo for x265::SEI in libx265.a(ratecontrol.cpp.o)
typeinfo for x265::FrameEncoder in libx265.a(frameencoder.cpp.o)
typeinfo for x265::SEI in libx265.a(frameencoder.cpp.o)
typeinfo for x265::FrameFilter::ParallelFilter in libx265.a(framefilter.cpp.o)
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"operator delete[](void*)", referenced from:
x265::Encoder::destroy() in libx265.a(encoder.cpp.o)
x265::FrameEncoder::destroy() in libx265.a(frameencoder.cpp.o)
x265::FrameFilter::destroy() in libx265.a(framefilter.cpp.o)
x265::Frame::destroy() in libx265.a(frame.cpp.o)
x265::Lookahead::destroy() in libx265.a(slicetype.cpp.o)
x265::FrameData::destroy() in libx265.a(framedata.cpp.o)
"operator delete(void*)", referenced from:
_x265_encoder_open_130 in libx265.a(api.cpp.o)
_x265_encoder_close in libx265.a(api.cpp.o)
x265::Encoder::destroy() in libx265.a(encoder.cpp.o)
x265::Encoder::encode(x265_picture const*, x265_picture*) in libx265.a(encoder.cpp.o)
x265::Encoder::computeSPSRPSIndex() in libx265.a(encoder.cpp.o)
x265::SEIContentLightLevel::~SEIContentLightLevel() in libx265.a(encoder.cpp.o)
x265::SEIMasteringDisplayColorVolume::~SEIMasteringDisplayColorVolume() in libx265.a(encoder.cpp.o)
...
"operator new[](unsigned long)", referenced from:
x265::Encoder::encode(x265_picture const*, x265_picture*) in libx265.a(encoder.cpp.o)
x265::ThreadPool::allocThreadPools(x265_param*, int&, bool) in libx265.a(threadpool.cpp.o)
x265::FrameEncoder::init(x265::Encoder*, int, int) in libx265.a(frameencoder.cpp.o)
x265::FrameEncoder::threadMain() in libx265.a(frameencoder.cpp.o)
x265::FrameEncoder::compressFrame() in libx265.a(frameencoder.cpp.o)
x265::SAO::allocSaoParam(x265::SAOParam*) const in libx265.a(sao.cpp.o)
x265::SAO::startSlice(x265::Frame*, x265::Entropy&) in libx265.a(sao.cpp.o)
...
"operator new(unsigned long)", referenced from:
_x265_encoder_open_130 in libx265.a(api.cpp.o)
x265::Encoder::create() in libx265.a(encoder.cpp.o)
x265::Encoder::encode(x265_picture const*, x265_picture*) in libx265.a(encoder.cpp.o)
x265::Encoder::computeSPSRPSIndex() in libx265.a(encoder.cpp.o)
x265::FrameEncoder::init(x265::Encoder*, int, int) in libx265.a(frameencoder.cpp.o)
x265::FrameEncoder::threadMain() in libx265.a(frameencoder.cpp.o)
x265::SAO::startSlice(x265::Frame*, x265::Entropy&) in libx265.a(sao.cpp.o)
...
"___cxa_guard_acquire", referenced from:
x265::RateControl::rateEstimateQscale(x265::Frame*, x265::RateControlEntry*) in libx265.a(ratecontrol.cpp.o)
x265::Deblock::getBoundaryStrength(x265::CUData const*, int, unsigned int, unsigned char const*) in libx265.a(deblock.cpp.o)
"___cxa_guard_release", referenced from:
x265::RateControl::rateEstimateQscale(x265::Frame*, x265::RateControlEntry*) in libx265.a(ratecontrol.cpp.o)
x265::Deblock::getBoundaryStrength(x265::CUData const*, int, unsigned int, unsigned char const*) in libx265.a(deblock.cpp.o)
"___cxa_pure_virtual", referenced from:
vtable for x265::BondedTaskGroup in libx265.a(frameencoder.cpp.o)
vtable for x265::BondedTaskGroup in libx265.a(framefilter.cpp.o)
vtable for x265::Thread in libx265.a(threading.cpp.o)
vtable for x265::BondedTaskGroup in libx265.a(slicetype.cpp.o)
vtable for x265::BondedTaskGroup in libx265.a(search.cpp.o)
vtable for x265::BondedTaskGroup in libx265.a(analysis.cpp.o)
vtable for x265::WaveFront in libx265.a(wavefront.cpp.o)
...
"___dynamic_cast", referenced from:
x265::FrameEncoder::threadMain() in libx265.a(frameencoder.cpp.o)
x265::FrameEncoder::encodeSlice(unsigned int) in libx265.a(frameencoder.cpp.o)
x265::FrameEncoder::processRowEncoder(int, x265::ThreadLocalData&) in libx265.a(frameencoder.cpp.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
If I compile using g++ this works fine, so I think it has to do with C support.
This also happens with the latest Mercurial commit (d58761d).
x265 was configured using
cmake ../source -DENABLE_SHARED=OFF
Comments (4)
-
Account Deactivated -
Account Deactivated Or you can try statically linking core utils (add -DSTATIC_LINK_CRT=ON to the cmake command line) so that the core utils are compiled into the libx265 library. Will bloat the library a bit, but that is an option.
-
reporter My mistake, -lstdc++ was the issue.
-
Account Deactivated - changed status to resolved
Was missing linker options in when compiling libx265
- Log in to comment
Although libx265 exports a C-API, it internally uses C++. Therefore, you will have to provide C++ libraries to to libx265 to link against so that it can find all the C++ references that it uses (like new, dynamic_cast, virtual functions, etc.). That seems to be your error above.