11

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.

3
  • 2
    Possible duplicate of Why are i2c_smbus function not available? (I2C – Embedded Linux) Commented May 3, 2018 at 11:47
  • 1
    No this is a new thing, they have reworked how I2C tools are created to avoid that issue mention in that question, that there are two identically named kernel space and user space includes, unfortunately not all guides are up to date. Commented Jul 12, 2018 at 6:11
  • But what exact problem do you have? Looks like you are considering only one possible solution, but possibly the are other solutions. Commented Apr 11, 2021 at 16:11

1 Answer 1

27

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> } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.