Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “如何链接动态库”-“li2c”;和Cmake一起?(未定义对“i2c\u smbus\u write\u byte\u data”的引用)_C++_Cmake_Linker_Shared Libraries_I2c - Fatal编程技术网

C++ “如何链接动态库”-“li2c”;和Cmake一起?(未定义对“i2c\u smbus\u write\u byte\u data”的引用)

C++ “如何链接动态库”-“li2c”;和Cmake一起?(未定义对“i2c\u smbus\u write\u byte\u data”的引用),c++,cmake,linker,shared-libraries,i2c,C++,Cmake,Linker,Shared Libraries,I2c,由于我对Cmake的使用还比较陌生,我真的不知道如何解决这个问题。在我的C++代码中,我使用Linux I2C库的函数,如下:< /P> extern "C" { #include <linux/i2c-dev.h> #include <i2c/smbus.h> } #include <sys/ioctl.h> #include <string.h> #include <stdio.h> #include <f

由于我对Cmake的使用还比较陌生,我真的不知道如何解决这个问题。在我的C++代码中,我使用Linux I2C库的函数,如下:< /P>
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找不到包(因为它没有.config文件),我也不知道在哪里定义了
i2c/smbus.h
中的函数


谢谢你的帮助

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

target_link_libraries(main, "/usr/lib/aarch64-linux-gnu/libi2c.so")
通常首选使用链接具有.pc文件的库

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


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

请显示(添加到问题帖中)
CMakeLists.txt
用于构建项目的脚本。target\u link\u libraries@drescherjm谢谢,这就解决了问题。我想你不想在CMakeLists.txt中的main.Absolute路径后面加逗号。
target_link_libraries(main, "/usr/lib/aarch64-linux-gnu/libi2c.so")
target_link_libraries(main i2c)