如何使用 Cmake link 动态库“-li2c”? (对 `i2c_smbus_write_byte_data` 的未定义引用)

How to link dynamic library "-li2c" with Cmake? (undefined reference to `i2c_smbus_write_byte_data`)

由于我对Cmake 的使用比较陌生,我真的不知道如何解决这个问题。在我的 C++ 代码中,我使用了 Linux i2c 库中的函数,如下所示:

extern "C" {
#include <linux/i2c-dev.h>
#include <i2c/smbus.h>
}
#include <sys/ioctl.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>

bool cpi2c_writeRegister(uint8_t address, uint8_t subAddress, uint8_t data) {
    return i2c_smbus_write_byte_data(address, subAddress, data) == 0;
}

我通常使用 CMakeLists 使用 Cmake 进行编译,但现在它不起作用,因为它声明:undefined reference to 'i2c_smbus_write_byte_data'。我尝试使用 G++ 动态地 link:

g++ -std=c++11 -Wall -c main.cpp
g++ -std=c++11 -o Main main.o -li2c

这很好用,没有问题。问题是我真的需要用 CMakeLists 编译,所以你知道如何实现这个吗?默认情况下,Cmake 找不到包(因为它没有 .config 文件),我不知道 i2c/smbus.h 中的函数在哪里定义。

感谢您的帮助!

答案是,您可以在创建可执行文件后使用命令target_link_libraries()。您必须提供对象的名称和 .so-file 的路径(通常在 /usr/lib 中找到)。就我而言,那将是:

target_link_libraries(main, "/usr/lib/aarch64-linux-gnu/libi2c.so")

使用 pkg-config 通常优于 link 具有 .pc 文件的库。

但是由于 libi2c 似乎没有安装 .pc 文件,您可以通过提供库名称直接使用 target_link_libraries()。为了简单和可移植性,使用“普通库名称”(参见 target_link_libraries documentation)。

target_link_libraries(main i2c)

CMake 会负责将纯库名称扩展为 -li2ci2c.lib 或任何适合您的构建环境和操作系统的名称。