【问题标题】:undefined reference to `i2c_smbus_read_block_data(int, unsigned char, unsigned char*)'未定义对 `i2c_smbus_read_block_data(int, unsigned char, unsigned char*)' 的引用
【发布时间】:2020-08-30 18:52:01
【问题描述】:

我正在尝试从 imu (mpu9250) 中读取数据块,但在构建时使用 g++ mpu.cpp -o mpu我收到以下错误:

/tmp/cckh5V8w.o: In function 'imu::read_accel()': 
mpu_mine9250.cpp:(.text._ZN3imu10read_accelEv[_ZN3imu10read_accelEv]+0x94): undefined reference to 'i2c_smbus_read_block_data(int, unsigned char, unsigned char*)'
collect2: error: ld returned 1 exit status ```
int addr = 0x68;
int mpu_file;
char mpu_filename[250];
snprintf(mpu_filename, 250, "/dev/i2c-0");
if (ioctl(mpu_file, I2C_SLAVE, addr) < 0){
     exit(1);
}
__u8 buf[14];
__u8 reg = 0x3B;
int ans= i2c_smbus_read_block_data(mpu_file, reg, buf);

要包含我尝试过的库:

#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>

还有:

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

我已经安装了 libi2c-dev、libi2c0 和 i2c-tools 软件包。

当使用write(mpu_file, buf, 2)read(mpu_file, buf, 1)时,它确实有效。

提前致谢!

【问题讨论】:

  • @crdrisko 我已经尝试过了,但仍然有同样的错误,谢谢你!
  • 您是否尝试过使用-l 选项链接库和您的项目的部分?请参阅链接的问题部分。
  • 您不仅需要使用 -l 链接库(提示 - 不需要有 lib 部分 - 所以使用 -li2c)您可能还需要使用 - 指定库位置L
  • @Den-Jason 谢谢两位的回答!我是 C++ 的新手,链接库的东西对我来说是新的,如果我犯了一些愚蠢的错误,我很抱歉!我尝试了以下方法:g++ -o mpu mpu_mine9250.cpp /usr/lib/arm-linux-gnueabihf/libi2c.ag++ -o mpu mpu_mine9250.cpp -li2cg++ -o mpu mpu_mine9250.cpp -l:libi2c.ag++ -o mpu mpu_mine9250.cpp -L/usr/lib/arm-linux-gnueabihf/libi2c.so -li2c 和其他组合,但它们都给了我同样的错误。 (该库已正确链接,因为如果我更改位置,则表示找不到该目录)。

标签: c++ linux i2c smbus


【解决方案1】:

解决方案是:

1.使用 extern C: 我使用的是 extern C,但也以常规方式包含它们,这导致了问题。

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

2.构建时链接库:

g++ -o mpu mpu_mine9250.cpp -li2c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多