неопределенная ссылка на `i2c_smbus_read_word_data (int, unsigned char)

После обновления до Ubuntu 18.04 я не могу скомпилировать приложение Qt.

Возникает следующая ошибка:

undefined reference to `i2c_smbus_read_word_data(int, unsigned char)

Как я понял, i2c_smbus_read_word_data теперь определяется не в linux / i2c-dev.h, а в динамической библиотеке /usr/lib/x86_64-linux-gnu/libi2c.so.

Я пытался динамически связать:

-li2c

и статически:

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

Но у меня все еще есть ошибка компиляции

UPD: установлены пакеты libi2c-dev, libi2c0 и i2c-tools.


person vitperov    schedule 03.05.2018    source источник
comment
Возможный дубликат Почему функция i2c_smbus недоступна? (I2C - встроенный Linux)   -  person S.M.    schedule 03.05.2018
comment
Нет, это новая вещь, они переработали способ создания инструментов I2C, чтобы избежать упоминания этой проблемы в этом вопросе, что есть два пространства ядра с одинаковыми именами и пространство пользователя, к сожалению, не все руководства обновлены.   -  person r_ahlskog    schedule 12.07.2018
comment
Но какая именно проблема у вас? Похоже, вы рассматриваете только одно возможное решение, но, возможно, это другие решения.   -  person user1742529    schedule 11.04.2021


Ответы (1)


Smbus include не «готов» к C ++, как большинство заголовков C для общего использования, поэтому в нем нет объявления extern "C", что означает, что компилятор C ++ искажает имена и связывание не удается.

Я бился об это головой в течение нескольких часов, прежде чем у меня возникло случайное озарение. Я исправил это, заключив включения в блок extern "C", и теперь моя программа снова связывает.

extern "C" {
    #include <linux/i2c-dev.h>
    #include <i2c/smbus.h>
}
person r_ahlskog    schedule 12.07.2018
comment
Боже, этот намек был золотым! - person Jonas Witt; 17.08.2020
comment
Честно говоря, это заслуживает пива! - person Maxim Sloyko; 27.10.2020