为什么我在 sys/stat.h 库中得到 "undefined reference to `_stat`"?
Why am I getting "undefined reference to `_stat`" in the sys/stat.h library?
我正在尝试使用 `#include 库中的 stat()
函数,但是每当我调用它时,我都会收到此错误:
...toolchains/gcc-arm-none-eabi-8-2018/arm-gcc-macos/arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(lib_a-statr.o): in function `_stat_r':
statr.c:(.text._stat_r+0xe): undefined reference to `_stat'
这是我的文件(我列出了所有包含的内容,我知道有些可能与此问题无关,但以防万一我列出了所有内容):
#include <kernel.h>
#include <device.h>
#include <drivers/i2c.h>
#include <sys/__assert.h>
#include <logging/log.h>
#include <sys/printk.h>
#include <soc.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define SOURCE_FILE "battery.gm.fs"
int write_to_dev(struct device* dev)
{
struct stat st;
int nSourceFile;
char *pFileBuffer;
stat(SOURCE_FILE, &st); // problematic line
// other code here
}
每当我打电话给 write_to_dev()
时,我都会遇到这个问题。我的代码基于此 link 的第 17 页:https://www.ti.com/lit/an/slua801/slua801.pdf?ts=1595360845070&ref_url=https%253A%252F%252Fwww.google.com%252F 感谢您的帮助!
编辑:我正在使用带有 Zephyr RTOS 和 TI BQ27621 电量计的 STM32 芯片
您尝试移植到设备的示例代码是为 Linux 系统编写的(例如 Raspberry Pi)。这样的系统比你的 MCU 板更强大:它有一个成熟的操作系统、文件系统和文件以及必要的 I/O 操作。您仍然可以使用 Zephyr OS:
在您的开发板上获取 运行 的相关部分
端系统相关 API
实现函数 gauge_read
、gauge_write
和 gauge_address
是 TI 文档所要求和描述的。它应该相当简单,因为它主要是 I2C 通信的包装器。 Zephyr 提供所需的 I2C 功能。
现在文件 gauge.c
和 gauge.h
应该可以编译了。
FlashStream初始化
示例代码使用文件系统操作来检索文件(FlashStream 格式)以初始化传感器。文件格式的解析器是 gauge.c
的一部分,并将字符串(文本文件内容)作为输入。所以它不依赖于文件系统操作。
我从未使用过这样的传感器,但我猜初始化文件很短,可以很容易地作为字符串嵌入。所以创建初始化文件,将其作为文本文件打开并将内容复制到您的程序中:
const char* fs =
"W: AA 3E 02 00\n"
"C: AA 3E 02 00 02 20 00 03\n"
"W: AA 3E 02 00\n";
现在你可以初始化传感器了:
gauge_execute_fs(pHandle, fs);
文件系统代码(stat()
、fopen()
等)不再需要,可以删除。您的程序现在应该可以编译和构建了。
我正在尝试使用 `#include stat()
函数,但是每当我调用它时,我都会收到此错误:
...toolchains/gcc-arm-none-eabi-8-2018/arm-gcc-macos/arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(lib_a-statr.o): in function `_stat_r':
statr.c:(.text._stat_r+0xe): undefined reference to `_stat'
这是我的文件(我列出了所有包含的内容,我知道有些可能与此问题无关,但以防万一我列出了所有内容):
#include <kernel.h>
#include <device.h>
#include <drivers/i2c.h>
#include <sys/__assert.h>
#include <logging/log.h>
#include <sys/printk.h>
#include <soc.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#define SOURCE_FILE "battery.gm.fs"
int write_to_dev(struct device* dev)
{
struct stat st;
int nSourceFile;
char *pFileBuffer;
stat(SOURCE_FILE, &st); // problematic line
// other code here
}
每当我打电话给 write_to_dev()
时,我都会遇到这个问题。我的代码基于此 link 的第 17 页:https://www.ti.com/lit/an/slua801/slua801.pdf?ts=1595360845070&ref_url=https%253A%252F%252Fwww.google.com%252F 感谢您的帮助!
编辑:我正在使用带有 Zephyr RTOS 和 TI BQ27621 电量计的 STM32 芯片
您尝试移植到设备的示例代码是为 Linux 系统编写的(例如 Raspberry Pi)。这样的系统比你的 MCU 板更强大:它有一个成熟的操作系统、文件系统和文件以及必要的 I/O 操作。您仍然可以使用 Zephyr OS:
在您的开发板上获取 运行 的相关部分端系统相关 API
实现函数 gauge_read
、gauge_write
和 gauge_address
是 TI 文档所要求和描述的。它应该相当简单,因为它主要是 I2C 通信的包装器。 Zephyr 提供所需的 I2C 功能。
现在文件 gauge.c
和 gauge.h
应该可以编译了。
FlashStream初始化
示例代码使用文件系统操作来检索文件(FlashStream 格式)以初始化传感器。文件格式的解析器是 gauge.c
的一部分,并将字符串(文本文件内容)作为输入。所以它不依赖于文件系统操作。
我从未使用过这样的传感器,但我猜初始化文件很短,可以很容易地作为字符串嵌入。所以创建初始化文件,将其作为文本文件打开并将内容复制到您的程序中:
const char* fs =
"W: AA 3E 02 00\n"
"C: AA 3E 02 00 02 20 00 03\n"
"W: AA 3E 02 00\n";
现在你可以初始化传感器了:
gauge_execute_fs(pHandle, fs);
文件系统代码(stat()
、fopen()
等)不再需要,可以删除。您的程序现在应该可以编译和构建了。