使用 Kendryte IDE编译自带工程gpio_led_standalone出错的解决办法

本文介绍了一种在编译过程中遇到的链接错误解决方案,通过添加一个空的子函数可以有效解决由未定义引用导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出错误如下:

INFO] [100%] Linking C executable gpio_led_standalone

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-vfprintf.o): in function `_vfprintf_r':

[ INFO] vfprintf.c:(.text._vfprintf_r+0x62): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0x80): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0xd6): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0xe2): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0x118): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0x124): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0x6f0): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text._vfprintf_r+0x6fc): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-vfprintf.o): in function `__sbprintf':

[ INFO] vfprintf.c:(.text.__sbprintf+0x4e): undefined reference to `_lock_init_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: vfprintf.c:(.text.__sbprintf+0x8c): undefined reference to `_lock_close_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-__atexit.o): in function `.L0 ':

[ INFO] __atexit.c:(.text.__register_exitproc+0x12): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: __atexit.c:(.text.__register_exitproc+0x44): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-__atexit.o): in function `.L6':

[ INFO] __atexit.c:(.text.__register_exitproc+0x9a): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-__call_atexit.o): in function `.L0 ':

[ INFO] __call_atexit.c:(.text.__call_exitprocs+0x1c): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: __call_atexit.c:(.text.__call_exitprocs+0x50): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fflush.o): in function `.L47':

[ INFO] fflush.c:(.text._fflush_r+0x24): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fflush.c:(.text._fflush_r+0x42): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fflush.o): in function `.L49':

[ INFO] fflush.c:(.text._fflush_r+0x6a): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fflush.c:(.text._fflush_r+0x76): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-findfp.o): in function `.L0 ':

[ INFO] findfp.c:(.text.std+0x68): undefined reference to `_lock_init_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-findfp.o): in function `__sfp_lock_acquire':

[ INFO] findfp.c:(.text.__sfp_lock_acquire+0x4): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-findfp.o): in function `__sfp_lock_release':

[ INFO] findfp.c:(.text.__sfp_lock_release+0x4): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-findfp.o): in function `__sinit_lock_acquire':

[ INFO] findfp.c:(.text.__sinit_lock_acquire+0x4): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-findfp.o): in function `__sinit_lock_release':

[ INFO] findfp.c:(.text.__sinit_lock_release+0x4): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-mlock.o): in function `__malloc_lock':

[ INFO] mlock.c:(.text.__malloc_lock+0x4): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-mlock.o): in function `__malloc_unlock':

[ INFO] mlock.c:(.text.__malloc_unlock+0x4): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fclose.o): in function `.L3':

[ INFO] fclose.c:(.text._fclose_r+0x1e): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fclose.c:(.text._fclose_r+0x3c): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fclose.o): in function `.L4':

[ INFO] fclose.c:(.text._fclose_r+0x56): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fclose.o): in function `.L6':

[ INFO] fclose.c:(.text._fclose_r+0x62): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fclose.o): in function `.L11':

[ INFO] fclose.c:(.text._fclose_r+0xd4): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fclose.c:(.text._fclose_r+0xde): undefined reference to `_lock_close_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fclose.c:(.text._fclose_r+0xee): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-fputwc.o): in function `_fputwc_r':

[ INFO] fputwc.c:(.text._fputwc_r+0x14): undefined reference to `pthread_setcancelstate'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fputwc.c:(.text._fputwc_r+0x32): undefined reference to `_lock_acquire_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fputwc.c:(.text._fputwc_r+0x7e): undefined reference to `_lock_release_recursive'

[ INFO] h:/k210/kendryteide/localpackage/toolchain/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/bin/ld.exe: fputwc.c:(.text._fputwc_r+0x8a): undefined reference to `pthread_setcancelstate'

[ INFO] collect2.exe: error: ld returned 1 exit status

[ INFO] mingw32-make.exe[2]: *** [CMakeFiles/gpio_led_standalone.dir/build.make:84: gpio_led_standalone] Error 1

[ INFO] mingw32-make.exe[1]: *** [CMakeFiles/Makefile2:73: CMakeFiles/gpio_led_standalone.dir/all] Error 2

[ INFO] mingw32-make.exe: *** [Makefile:84: all] Error 2

[ INFO]

[ INFO] Build Error: h:/K210/KendryteIDE/LocalPackage/cmake/bin/cmake.exe exited with code 2.

 

解决办法:

在 main函数之前再加一个不用的子函数即可解决,如下:

int solve()
{
    printf("solve");
}

<think>好的,用户遇到了编译时找不到xparameters.h的问题,需要解决。首先,我得回忆一下xparameters.h通常是什么情况下使用的。这个文件通常和Xilinx的开发工具相关,特别是在使用他们的FPGA或嵌入式系统开发时,比如在Vivado或Xilinx SDK中。这个头文件一般包含了一些硬件配置的参数,比如外设的基地址等。 用户提到编译时报错找不到这个文件,可能的原因有几个。首先,最常见的情况是开发环境没有正确安装或者路径配置不对。Xilinx的工具链通常需要设置环境变量,或者需要在编译时指定头文件的路径。例如,用户可能没有安装Xilinx的软件开发套件(SDK)或者Vivado的设计工具,这些工具通常会包含这个头文件。 其次,用户的项目可能没有正确配置包含路径。在编译命令中,需要使用-I选项来指定xparameters.h所在的目录。比如,如果这个文件位于/opt/Xilinx/SDK/2018.3/data/embeddedsw/lib/bsp/standalone_v6_6/src/arm/cortexa9,那么编译时需要加上-I/opt/Xilinx/SDK/2018.3/data/embeddedsw/lib/bsp/standalone_v6_6/src/arm/cortexa9这样的参数。 另外,用户可能没有正确生成这个文件。xparameters.h通常是由Xilinx的工具自动生成的,特别是在创建硬件平台后导出到SDK时。如果用户没有正确生成硬件平台或者导出步骤有误,这个文件可能缺失。这时候需要检查Vivado工程,确认是否已经生成了硬件描述文件,并正确导出到SDK中。 还有可能用户安装的Xilinx工具版本有问题,或者文件被误删。这时候重新安装SDK或者Vivado,或者从备份中恢复文件可能有效。同时,权限问题也不能排除,需要确认用户是否有权限访问该文件所在的目录。 接下来,用户提供的引用内容中有一个测试程序firstdrvtest.c,里面涉及创建设备节点/dev/xyz,这可能和嵌入式Linux驱动开发相关。可能用户正在开发一个Linux驱动,需要用到Xilinx平台的相关头文件。这时候需要确认交叉编译工具链是否正确配置,以及是否针对目标平台进行了正确的环境设置。 总结可能的解决步骤:1. 确认Xilinx工具是否正确安装,并检查xparameters.h是否存在。2.编译命令中添加正确的包含路径。3. 重新生成硬件平台并导出到SDK。4. 检查环境变量如XILINX_SDK的设置。5. 确保交叉编译工具链配置正确。此外,可能需要参考Xilinx的文档或社区寻求帮助,比如在Xilinx论坛查找类似问题。 用户可能需要更详细的指导,比如如何找到xparameters.h的位置,如何设置环境变量,或者如何在Makefile中添加包含路径。另外,如果用户是在嵌入式Linux内核模块开发中遇到这个问题,可能需要确认内核源码路径是否正确,或者是否安装了对应的开发包。</think>### 解决`xparameters.h`编译报错问题的分步指南 #### 1. **确认开发环境完整性** `xparameters.h`是Xilinx嵌入式开发工具链(如Vivado、Vitis或Xilinx SDK)生成的核心头文件,用于定义硬件平台的寄存器地址和配置参数。 - **检查Xilinx工具安装**: 确保已安装Vivado/Vitis并正确配置许可证。若未安装,需从[Xilinx官网](https://www.xilinx.com/support/download.html)下载对应版本。 - **验证文件存在性**: 在Xilinx工程目录中搜索该文件,路径通常为: ```bash <工程路径>/<硬件平台名>/export/<硬件平台名>/sw/<硬件平台名>/bsp/standalone/src/arm/cortexa9/ ``` 若文件缺失,需重新生成硬件平台(见步骤3)[^1]。 #### 2. **配置编译包含路径** 编译器需明确知道`xparameters.h`的位置。 - **命令行编译示例**: ```bash gcc -I/path/to/xparameters/dir your_source.c -o output ``` 替换`/path/to/xparameters/dir`为实际路径。 - **在IDE中配置**:使用Xilinx Vitis或XSCT,需在工程属性中添加包含路径: ``` Project > Properties > C/C++ Build > Settings > Includes > Add Directory ``` #### 3. **重新生成硬件平台** 若文件因工程出错误丢失: 1. 在Vivado中打开工程,进入`File > Export > Export Hardware`。 2. 勾选**Include bitstream**,选择输出路径。 3. 在Vitis中创建新平台工程,导入导出的`.xsa`文件,系统将自动生成`xparameters.h`[^1]。 #### 4. **检查交叉编译工具链** 嵌入式开发需使用Xilinx提供的交叉编译器(如`arm-xilinx-eabi-gcc`)。 - 验证工具链是否安装: ```bash arm-xilinx-eabi-gcc --version ``` - 若未安装,通过Vitis安装器添加**Embedded Development**组件。 #### 5. **修复权限问题** 若文件存在但编译器仍报错,可能是权限限制: ```bash sudo chmod -R 755 /opt/Xilinx # 假设Xilinx工具安装在/opt/Xilinx ``` #### 6. **替代方案(谨慎使用)** 在非Xilinx工程中,若需模拟该文件,可手动创建基础定义: ```c // xparameters_dummy.h #define XPAR_AXI_GPIO_0_BASEADDR 0x40000000 #define XPAR_AXI_UARTLITE_0_BASEADDR 0x40600000 ``` ⚠️ 此方法可能导致硬件操作异常,仅限临时测试。 --- ### 相关问题 1. **如何验证Xilinx嵌入式工具链的安装是否正确?** > 答:运行`vivado -version`和`arm-xilinx-eabi-gcc --version`,检查版本是否匹配工程需求[^1]。 2. **Vivado导出硬件时出现错误如何排查?** > 答:检查IP核许可证状态、Block Design验证结果(`Validate Design`),以及Tcl控制台的错误日志。 3. **嵌入式Linux驱动开发中`xparameters.h`与设备树(Device Tree)的关系?** > 答:`xparameters.h`用于裸机/BareMetal程序,而Linux驱动通过设备树获取硬件地址,两者需区分使用场景。 : 引用[1]:测试程序firstdrvtest.c及设备节点创建流程示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值