在pmon中增加了新的源码文件后,链接时提示undefined reference to xxx。经过一番定位后,发现不是把新源文件放到pmon的一个子目录就可以,还需要修改配置。
这里的配置怎么理解呢?我的理解是pmon其实是一个小的操作系统,支持不只一种cpu,支持多种外设,需要通过配置文件来选择需要编译的文件。这和linux类似,在(make)编译linux之前,需要先执行make menuconfig。
百度文库里面有个文档——《pmon基础知识》讲得不错。这里把文档内容截图后贴在下面
配置文件位于各个目录下的conf目录内,在conf目录内的文件”file.xxx”里面增加一行
file <path to file> [modname]
这样pmon的配置工具就会把相应的源文件加入到Makefile中,并编译为.o文件,这样才能ld链接时才能顺利通过。
并放入目录“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的基础上,实现一些定制化的功能。
并放入目录“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
感谢耐心阅读!