如何在pmon中增加新源码文件undefined reference to

本文介绍了在Pmon中增加新源码文件时遇到的undefined reference问题及其解决方法。首先,需要理解Pmon的配置原理,通过在配置文件中添加源文件路径使编译器将其编译为.o文件。然后,提供了一个示例,详细说明了新建源文件和头文件、修改配置、调用测试函数以及编译的步骤。最后,通过在initmips()函数中调用测试函数完成功能集成,并展示了未配置时的错误提示。

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

前言

在pmon中增加了新的源码文件后,链接时提示undefined reference to xxx。经过一番定位后,发现不是把新源文件放到pmon的一个子目录就可以,还需要修改配置。

这里的配置怎么理解呢?我的理解是pmon其实是一个小的操作系统,支持不只一种cpu,支持多种外设,需要通过配置文件来选择需要编译的文件。这和linux类似,在(make)编译linux之前,需要先执行make menuconfig。

Pmon的配置简介

百度文库里面有个文档——《pmon基础知识》讲得不错。这里把文档内容截图后贴在下面

配置文件位于各个目录下的conf目录内,在conf目录内的文件”file.xxx”里面增加一行

file  <path to file>   [modname]

这样pmon的配置工具就会把相应的源文件加入到Makefile中,并编译为.o文件,这样才能ld链接时才能顺利通过。

示例(新增一个源文件test_add_file.c)

新建源文件test_add_file.c

并放入目录“pmon根目录/Targets/LS1X/dev/”中,源文件内容如下

#include <stdio.h>

void test_add_file(void)
{
	printf("[%s]: qin_wei_ben test add file to pmon\r\n", __FUNCTION__);
}

这里解释一下,为什么把测试用的源文件放目录“pmon根目录/Targets/LS1X/dev/”中。因为这个目录常用于放外设的驱动文件,比如gpio,串口,i2c等。

如果这个示例测试成功的话,可以参考这种方法把“龙芯1c库”的文件添加到pmon中,这样可以实现,在pmon的基础上,实现一些定制化的功能。

新建头文件test_add_file.h

并放入目录“pmon根目录/Targets/LS1X/include/”中,头文件内容如下

#ifndef TEST_ADD_FILE_H
#define TEST_ADD_FILE_H

void test_add_file(void);

#endif

修改配置

在文件“pmon根目录/Targets/LS1X/conf/files.LS1X”中添加如下配置信息,

file    Targets/LS1X/dev/test_add_file.c

如下图所示

这样pmon的配置工具就会把源文件test_add_file.c写进Makefile中,并编译为test_add_file.o文件

如果没有增加这个配置,编译时会有如下提示

tgt_machdep.c:(.text+0x15e4): undefined reference to `test_add_file'

即,提示找不到相关函数的实现。进一步分析是,如果没加配置项,就不会编译源文件“test_add_file.c”,自然也就找不到函数test_add_file()

调用测试函数

在源文件“pmon根目录/Targets/LS1X/ls1x/tgt_machdep.c”中include头文件“test_add_file.h”,并在函数initmips()中调用测试函数test_add_file()

这里解释一下,为什么头文件是放在目录“pmon根目录/Targets/LS1X/include/”中,而include的时候却是target下。因为编译的时候,会自动把目录“pmon根目录/Targets/LS1X/include/”中的头文件拷贝到目录“pmon根目录/Targets/LS1X/compile/ls1c/target/”下。实际上文件夹“pmon根目录/Targets/LS1X/compile”会被自动创建,所有的编译其实就是在这个目录中进行的。

编译

cd zloader.ls1c/
make cfg && make tgt=rom

串口打印

 

感谢耐心阅读!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值