You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在main函数中调用i2d_nss_example_1及解决未定义引用错误

问题描述

我是C++新手,用LPCXpresso搭配LPC-link2开发环境,想在main函数里调用示例代码里的i2d_nss_example_1函数。原示例代码里有这个函数,还有外部变量current_native、current_picoampere。把代码内联到main里能正常运行,但提取成独立函数调用时,调试就弹出**Undefined reference to 'current_native'、'current_picoampere'**的错误,求解决办法。

原示例代码

extern volatile int current_native;
extern volatile int current_picoampere;
void i2d_nss_example_1(void) {
//! [i2d_nss_example_1]
int i2dValue;
int i2dNativeValue;
Chip_IOCON_SetPinConfig(NSS_IOCON, IOCON_ANA0_4, IOCON_FUNC_1); /* Set pin function to analog */
Chip_I2D_Init(NSS_I2D);
Chip_I2D_Setup(NSS_I2D, I2D_SINGLE_SHOT, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_SetMuxInput(NSS_I2D, I2D_INPUT_ANA0_4);
Chip_I2D_Start(NSS_I2D);
while (!(Chip_I2D_ReadStatus(NSS_I2D) & I2D_STATUS_CONVERSION_DONE)) { ; /* wait */ }
i2dNativeValue = Chip_I2D_GetValue(NSS_I2D);
i2dValue = Chip_I2D_NativeToPicoAmpere(i2dNativeValue, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_DeInit(NSS_I2D);
//! [i2d_nss_example_1]
current_native = i2dNativeValue;
current_picoampere = i2dValue;
}

可正常运行的内联代码

#include "board.h"
extern volatile int current_native;
extern volatile int current_picoampere;
int main(void) {
Board_Init();
int i2dValue;
int i2dNativeValue;
Chip_IOCON_SetPinConfig(NSS_IOCON, IOCON_ANA0_4, IOCON_FUNC_1); /* Set pin function to analog */
Chip_I2D_Init(NSS_I2D);
Chip_I2D_Setup(NSS_I2D, I2D_SINGLE_SHOT, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_SetMuxInput(NSS_I2D, I2D_INPUT_ANA0_4);
Chip_I2D_Start(NSS_I2D);
while (!(Chip_I2D_ReadStatus(NSS_I2D) & I2D_STATUS_CONVERSION_DONE)) { ; /* wait */ }
i2dNativeValue = Chip_I2D_GetValue(NSS_I2D);
i2dValue = Chip_I2D_NativeToPicoAmpere(i2dNativeValue, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_DeInit(NSS_I2D);
}

出现错误的代码

#include "board.h"
extern volatile int current_native;
extern volatile int current_picoampere;
static void i2d_nss_example_1(void);
static void i2d_nss_example_1(void) {
//! [i2d_nss_example_1]
int i2dValue;
int i2dNativeValue;
Chip_IOCON_SetPinConfig(NSS_IOCON, IOCON_ANA0_4, IOCON_FUNC_1); /* Set pin function to analog */
Chip_I2D_Init(NSS_I2D);
Chip_I2D_Setup(NSS_I2D, I2D_SINGLE_SHOT, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_SetMuxInput(NSS_I2D, I2D_INPUT_ANA0_4);
Chip_I2D_Start(NSS_I2D);
while (!(Chip_I2D_ReadStatus(NSS_I2D) & I2D_STATUS_CONVERSION_DONE)) { ; /* wait */ }
i2dNativeValue = Chip_I2D_GetValue(NSS_I2D);
i2dValue = Chip_I2D_NativeToPicoAmpere(i2dNativeValue, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_DeInit(NSS_I2D);
//! [i2d_nss_example_1]
current_native = i2dNativeValue;
current_picoampere = i2dValue;
}
int main(void) {
Board_Init();
i2d_nss_example_1();
}
解决办法

嘿,这个问题我之前刚踩过坑,本质是变量的声明和定义搞混了,给你一步步说怎么解决:

1. 搞懂extern的作用:声明≠定义

你代码里的extern volatile int current_native;只是告诉编译器“这个变量在其他地方已经定义了,你去别处找它”,但你现在根本没在任何地方实际定义这两个变量!

内联代码能运行是因为你没用到这两个变量(内联代码里最后没有赋值给它们),编译器没去查找定义;但提取成函数后,函数里给这两个变量赋值了,链接器就必须找到它们的定义,找不到就报错。

解决步骤:

在你的项目里找一个合适的地方(比如main所在的.c文件开头,或者专门的全局变量文件里)添加变量的定义:

// 注意:这里不要加extern,这是实际定义,还可以初始化
volatile int current_native = 0;
volatile int current_picoampere = 0;

然后在需要使用它们的地方(比如你的i2d_nss_example_1函数所在文件)保留extern声明就行。

2. 检查static关键字的潜在影响

你把函数设成了static void i2d_nss_example_1(void),这个本身不会导致变量的未定义错误,但如果你的变量是在其他static作用域里定义的,那会导致无法访问。不过你这个情况主要是变量没定义,先解决第一个问题再说。

3. 确认编译链接的文件范围

如果你的变量是在另一个.c文件里定义的,要确保那个.c文件已经被添加到LPCXpresso的项目中,没有被排除在编译之外。可以在项目管理器里检查一下,确保所有相关源文件都打了编译标记。

修改后的正确代码示例

比如把变量定义放在main所在的文件里:

#include "board.h"

// 实际定义全局变量,不要加extern
volatile int current_native = 0;
volatile int current_picoampere = 0;

static void i2d_nss_example_1(void);
static void i2d_nss_example_1(void) {
//! [i2d_nss_example_1]
int i2dValue;
int i2dNativeValue;
Chip_IOCON_SetPinConfig(NSS_IOCON, IOCON_ANA0_4, IOCON_FUNC_1); /* Set pin function to analog */
Chip_I2D_Init(NSS_I2D);
Chip_I2D_Setup(NSS_I2D, I2D_SINGLE_SHOT, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_SetMuxInput(NSS_I2D, I2D_INPUT_ANA0_4);
Chip_I2D_Start(NSS_I2D);
while (!(Chip_I2D_ReadStatus(NSS_I2D) & I2D_STATUS_CONVERSION_DONE)) { ; /* wait */ }
i2dNativeValue = Chip_I2D_GetValue(NSS_I2D);
i2dValue = Chip_I2D_NativeToPicoAmpere(i2dNativeValue, I2D_SCALER_GAIN_10_1, I2D_CONVERTER_GAIN_HIGH, 100);
Chip_I2D_DeInit(NSS_I2D);
//! [i2d_nss_example_1]
current_native = i2dNativeValue;
current_picoampere = i2dValue;
}

int main(void) {
Board_Init();
i2d_nss_example_1();
// 这里可以正常使用current_native和current_picoampere了
while(1); // 防止程序退出
}

这样修改后,链接器就能找到变量的定义,错误就会消失啦~

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:37:37