Libav linking error: undefined references-Collection of common programming errors


  • Fedech

    Here’s my problem:

    • I built ffmpeg from source (version 1.2), the libav* libraries are in /usr/local/lib and they’re static
    • I’m compiling a ns3 (www.nsnam.org) module, so my only control over the linker is through the env variable LINKFLAGS
    • In the source the headers are in a “extern C” block, so it’s not the usual g++ name mangling
    • I set LINKFLAGS=”-I/usr/local/include/libavformat -I/usr/local/include/libavcodec -I/usr/local/include/libavutil -L/usr/local/lib -lavformat -lavcodec -lavutil”, and the linker can’t seem to find any of the libav* functions I call (I get a lot of “undefined reference” and then “collect2: error: ld returned status 1”

    Can anyone help me? Thanks…

    edit: here are a few of the undefined reference messages:

        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_guess_format'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_read_frame'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_write_header'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_interleaved_write_frame'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_find_stream_info'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_register_all'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_init_packet'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avformat_alloc_context'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `av_dump_format'
        ./libns3.14.1-qoe-monitor-debug.so: undefined reference to `avio_close'
    

    edit2: here is the message I get after “build failed”:

    -> task in 'scratch-simulator' failed (exit status 1): 
    {task 53952272: cxxprogram scratch-simulator.cc.1.o -> scratch-simulator}
    ['/usr/bin/g++', '-I/usr/local/include/libavcodec', '-I/usr/local/include/libavformat/',
     '-I/usr/local/include/libavutil/', '-L/usr/local/lib', '-I/usr/local
    /include/libavcodec', '-I/usr/local/include/libavformat/', '-I/usr/local/include
    /libavutil/', '-L/usr/local/lib', '-pthread', '-pthread', '-Wl,-z,relro', 
    'scratch/scratch-simulator.cc.1.o', '-o', '/home/fede/Thesis/ns-allinone-3.14.1
    /ns-3.14.1/build/scratch/scratch-simulator', '-Wl,-Bstatic', '-Wl,-Bdynamic', 
    '-Wl,--no-as-needed', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.',
     '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.',
     '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', '-L.', 
    '-L.', '-L.', '-L.', '-L.', '-L.', '-L/usr/lib', '-lns3.14.1-test-debug', '-lns3.14.1-
    csma-layout-debug', '-lns3.14.1-point-to-point-layout-debug', '-lns3.14.1-netanim-
    debug', '-lns3.14.1-lte-debug', '-lns3.14.1-spectrum-debug', '-lns3.14.1-antenna-
    debug', '-lns3.14.1-aodv-debug', '-lns3.14.1-dsdv-debug', '-lns3.14.1-dsr-debug', 
    '-lns3.14.1-mesh-debug', '-lns3.14.1-olsr-debug', '-lns3.14.1-csma-debug', '-lns3.14.1-
    wimax-debug', '-lns3.14.1-applications-debug', '-lns3.14.1-virtual-net-device-debug', 
    '-lns3.14.1-uan-debug', '-lns3.14.1-energy-debug', '-lns3.14.1-flow-monitor-debug', 
    '-lns3.14.1-nix-vector-routing-debug', '-lns3.14.1-tap-bridge-debug', '-lns3.14.1-
    visualizer-debug', '-lns3.14.1-internet-debug', '-lns3.14.1-bridge-debug', '-lns3.14.1-
    point-to-point-debug', '-lns3.14.1-mpi-debug', '-lns3.14.1-wifi-debug', '-lns3.14.1-
    buildings-debug', '-lns3.14.1-propagation-debug', '-lns3.14.1-mobility-debug', 
    '-lns3.14.1-config-store-debug', '-lns3.14.1-tools-debug', '-lns3.14.1-stats-debug',
     '-lns3.14.1-emu-debug', '-lns3.14.1-topology-read-debug', '-lns3.14.1-network-debug', 
    '-lns3.14.1-qoe-monitor-debug', '-lns3.14.1-core-debug', '-lrt', '-lgsl', 
    '-lgslcblas', '-lm', '-ldl', '-lgtk-x11-2.0', '-lgdk-x11-2.0', '-latk-1.0', 
    '-lgio-2.0', '-lpangoft2-1.0', '-lpangocairo-1.0', '-lgdk_pixbuf-2.0', '-lcairo', 
    '-lpango-1.0', '-lfreetype', '-lfontconfig', '-lgobject-2.0', '-lglib-2.0', '-lxml2', 
    '-lpython2.7']
    

  • Multimedia Mike

    Thanks for posting the output of the build system. As an aside, what build system is that? Is it Scons?

    I studied that build output (I assume that all the individual elements in the array or concatenated into a string and executed). I’m not seeing -lavformat anywhere. I did a cmd-f search within my browser in order to confirm this. Why doesn’t it show up? Are you sure that all the contents of LINKFLAGS is making it into that output?


  • Jason C

    The libraries are C. The library headers don’t include an extern “C” when compiled as C++. Do this in your C++ source:

    extern "C" { 
    #include  
    #include 
    }
    

    Or, more generically, for mixed C and C++ source:

    #ifdef __cplusplus
    extern "C" {
    #endif
    #include  
    #include 
    #ifdef __cplusplus 
    }
    #endif
    

    And you should be fine.