一. 陈述问题
在使用segger embedded studio(IDE)开发nordic 52840过程中,我们编译出现了如下错误:
E:/Program/SES/lib/libc_v7em_fpv4_sp_d16_hard_t_le_eabi_balanced.a(fileops.o): in function `putchar':
fileops.c:(.text.libc.putchar+0x0): undefined reference to `stdout'
fileops.c:(.text.libc.putchar+0x4): undefined reference to `stdout'
E:/Program/SES/lib/libc_v7em_fpv4_sp_d16_hard_t_le_eabi_balanced.a(fileops.o): in function `puts':
fileops.c:(.text.libc.puts+0x2): undefined reference to `stdout'
fileops.c:(.text.libc.puts+0x6): undefined reference to `stdout'
fileops.c:(.text.libc.puts+0x18): undefined reference to `__SEGGER_RTL_X_file_write'
E:/Program/SES/lib/libc_v7em_fpv4_sp_d16_hard_t_le_eabi_balanced.a(fileops.o): in function `fwrite':
fileops.c:(.text.libc.fwrite+0xc): undefined reference to `__SEGGER_RTL_X_file_stat'
fileops.c:(.text.libc.fwrite+0x24): undefined reference to `__SEGGER_RTL_X_file_write'
Build failed
二. 分析问题
通过编译错误简单分析得知,有相关的函数或标识符未定义。
三. 解决问题
1. 在segger和noridc论坛查到相关参考资料:
:1.1. nRF5 SDK 17.1.0 示例未在最新的 SES (6.20a) 中编译 - 北欧问答 - 北欧开发区 - 北欧开发区 (nordicsemi.com)
1.2. 构建环境问题 - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)
1.3. Build Environment Problem - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com)
2. 通过上面的参考资料得知,相关函数没有定义,重新定向即可。
2.1. project - options - private configuration - common
2.1.1. Code - Library - Library I/O, 由none修改为RTT。
PS:
1. segger embedded studio的项目管理是从空间范围大小依次solution > Project > file folder > file.简单说solution下面可以有多个project,project下面的结构则跟MDK keil是一样的。未在指定级别上做修改的所有选项都将继承自上层,这样就可以在一个级别上修改某些选项,例如定义、包含目录或优化级别,同时保留所有其他选项。
所以在选择的时候一定需要注意选择project。
2. solution和project下面有不同的configuration。
solution有Public Configuration,Private Configuration 和 Loader Configuration 配置。
project有Public Configuration(debug、release),Private Configuration(common)。
可以在一个地方设置默认和共享选项。然后,可以根据构建配置设置或覆盖特定选项。 这就是“私有配置”和“公共配置”的用途。 公共配置是构建配置。可以选择和构建它,并生成输出。 无法构建私有配置。相反,公共配置可以继承一个或多个私有配置中设置的选项。 这样,所有构建配置(“Debug”和“Release”)都可以从相同的私有配置(“Common”)继承共享选项。 目标处理器,包括目录,...,只需在“Common”中设置,并在“Debug”和“Release”中使用。
参考资料: