【问题标题】:How to link dynamic library "-li2c" with Cmake? (undefined reference to `i2c_smbus_write_byte_data`)如何将动态库“-li2c”与Cmake链接? (未定义对 `i2c_smbus_write_byte_data` 的引用)
【发布时间】:2021-01-01 12:59:13
【问题描述】:

由于我对 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++ 进行动态链接:

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

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

感谢您的帮助!

【问题讨论】:

标签: c++ cmake linker shared-libraries i2c


【解决方案1】:

通常首选使用pkg-config 来链接具有 .pc 文件的库。

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

target_link_libraries(main i2c)

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我不认为你想要在 main 后面加逗号。
    • CMakeLists.txt 中的绝对路径不好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多