Undefined symbols for architecture x86_64

Issue #363 resolved
Kyle Schwarz created an issue

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)

  1. Pradeep Ramachandran Account Deactivated

    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.

  2. Pradeep Ramachandran 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.

  3. Log in to comment