Search code examples
c++gcci2cubuntu-18.04

undefined reference to `i2c_smbus_read_word_data(int, unsigned char)


After updating to Ubuntu 18.04 I can't compile my Qt application.

The following error occurs:

undefined reference to `i2c_smbus_read_word_data(int, unsigned char)

As I understood, i2c_smbus_read_word_data is now defined not in linux/i2c-dev.h, but in dynamic library /usr/lib/x86_64-linux-gnu/libi2c.so.

I tryed to link dynamically:

-li2c

and statically:

/usr/lib/x86_64-linux-gnu/libi2c.a

But I still have compillation error

UPD: libi2c-dev, libi2c0 and i2c-tools packages are installed.


Solution

  • The smbus include is not C++ "ready" as most C headers for general use are, so it does not have an extern "C" declaration which means the C++ compiler mangles the names and the linking fails.

    I beat my head against this for a few hours before I had an accidental insight. I fixed it by wrapping the includes in an extern "C" block and now my program links again.

    extern "C" {
        #include <linux/i2c-dev.h>
        #include <i2c/smbus.h>
    }