kei中移植库问题

Tasman2008 2014-02-26 12:22:12
各位大牛,keil中库移植问题,求指教:
1、在工程1中,keil下,所有文件都是.cpp后缀,使用c++编写的,编译后生成了一个库文件;
2、将该库移植到keil环境下的另外一个工程,该工程使用c语言编写,无法移植成功
如下测试代码:
工程1、a.cpp + a.h -->a.lib;(可以编译成功,生成了库文件)
工程2、b.c + a.lib + a.h -->。。 (报错)

代码如下:
工程1、a.cpp:
#include<vector>
#include<stdio.h>
#include "vec_test.h"
using namespace std;
void Vec_Test(void)
{
vector<int> vt;
vt.push_back(1);
printf("\r\nVec_Test >> vt.push_back(1) = %d", vt[0]);
// printf("\r\nVec_Test >>");
}
//////////////////////////////////////////////
a.h:
#ifndef _VEC_TEST_H
#define _VEC_TEST_H

extern "C" {
extern void Vec_Test(void);
}
#endif

工程2、
b.c
#include <stdio.h>
//
#include "vec_test.h"

int main (void) {
//
Vec_Test();

printf ("Hello World\n"); /* the 'printf' function call */

while (1) {
; /* ... */
}
}
//////////////////////
a.h
#ifndef _VEC_TEST_H
#define _VEC_TEST_H

extern void Vec_Test(void);

#endif


这样工程2编译后,一直提示如下错误,求赐教:
.\Obj\Hello.axf: Error: L6218E: Undefined symbol __aeabi_unwind_cpp_pr0 (referred from rwalloc.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol abort (referred from rwstdexcept.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol getenv (referred from rwstdexcept.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol __rt_new_handler_addr (referred from new.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol mbrtowc (referred from locale.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol wcrtomb (referred from locale.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol __rt_eh_globals_addr (referred from arm_exceptions_globs.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol __rt_ddtor_pointer_addr (referred from aeabi_atexit.o).
.\Obj\Hello.axf: Error: L6218E: Undefined symbol __rt_lib_shutdown_cpp_1 (referred from aeabi_atexit.o).
...全文
224 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lbing7 2014-02-26
  • 打赏
  • 举报
回复
KEIL的什么版本?能支持CPP了?
dceacho 2014-02-26
  • 打赏
  • 举报
回复
没有#include "a.lib"?
Tasman2008 2014-02-26
  • 打赏
  • 举报
回复
keil 4.23,可以了的
优秀的处理器配合好的开发工具和工具链成就了单片机的辉煌,这是单片机开发者辛勤劳动的结果。也正因为此,ARM的工具链工程师和CPU工程师强强联手,日日夜夜不停耕耘为ARM7TDMI设计出了精练、优化和到位的内部结构,终于成就了ARM7TDMI的风光无限的辉煌。新的ARMCortex-MB处理器在破茧而出之后,就处处闪耀着ARM体系结构激动人心的新突破。它是基于最新最好的32为ARMv7架构,支持高度成功的Thumb-2指令集,并带来了很多前卫崭新的特性。在它优秀,强大的同时,编程模型也更清爽,因而无论你是新手还是骨灰级玩家都会对这样秀外慧的小尤物爱不释手。根据ARM的统计,2010年全部Cortex-MMCU出货量为1.44亿片,2008年~2011年第一季度,STM32累计出货量占Cortex-MMCU出货量的45%。也就是说,两个Cortex-M微控制器有一个就来自ST。”很多市场分析机构也ARM的强劲增长表示认可。2007年在3264bitMCU及MPU架构,ARM所占市场份额为13.6%,而2010年已经占了23.5%击败了PowerArchitecture,成为市场占有率最多的架构。Cortex-n3内核是ARM公司整个Cortex内核系列的微控制器系列(M)内核还是其他两个系列分别是应用处理器系列(A)与实时控制处理系列(R),这三个系列又分别简称为A、R、M系列。当然,这三个系列的内核分别有各自不同的应用场合。Cortex-MB内核是为满足存储器和处理器的尺寸对产品成本影响很大的广泛市场和应用领域的低成本需求而专门开发设计的。主要是应用于低成本、小管脚数和低功耗的场合,并且具有极高的运算能力和极强的断响应能力。Cortex-M3处理器采用纯Thumb2指令的执行方式,这使得这个具有32位高性能的ARM内核能够实现8位和16位的代码存储密度。核心门数只有3K,在包含了必要的外设之后的门数也只有60K,使得封装更为小型,成本更加低廉。Cortex-n3采用了ARMV7哈佛架构,具有带分支预测的3级流水线,断延退最大只有12个时钟周期,在末尾连锁的时候只需要6个时钟周期。同时具有1.25DMIPS/MHZ的性能和0.19MW/MHZ的功耗。     社会对基于ARM的嵌入式系统开发人员的高需求及给予的高回报,催生了很多的培训机构,这也说明嵌入式系统的门槛较高,其主要原因有以下几点。ARM本身复杂的体系结构和编程模型,使得我们必须了解详细的汇编指令,熟悉ARM与Thumb状态的合理切换,才能理解Bootloader并对操作系统进行移植,而理解Bootloader本身就比较困难,因而对于初学者来说Bootloader的编写与操作系统的移植成了入门的第一道难以逾越的门槛2、ARM芯片,开发板及仿真器的高成本,这样就直接影响了嵌入式开发的普及,使得这方面人才增长缓慢;3、高校及社会上高水平嵌入式开发人员的短缺,现实问题使得我们的大学生和公司职工在入门的道路上困难重重,很多人也因此放弃;培训机构的高费用,虽然有高水平的老师指导,但是高费用就是一道关口,进去的人也只是在短短的几天时间里匆匆了解了一下开发过程,消除了一些畏惧心理而己,修行还是得依靠自己;5、好的开发环境需要资金的支持,也直接影响了入门的进度。基于Cortex-m3内核的ARM处理器的出现,在优秀的Kei开发工具的支持下,可以自动生成启动代码,省去了复杂的Bootloader的编写。Thumb-2指令集的使用,使得开发人员不用再考虑ARM状态与Thumb状态的切换,节省了执行时间和指令空间,大大减轻了软件开发的管理工作。处理器与内存尺寸的减少,大大降低了成本,使得芯片及开发板的价格得以在很大程度降低。Cortex-M3内核通过把断控制器、MPU及各种调试组件等基础设施的地址固定很大程度上方便了程序的移植。源代码是公开的函数,使得我们可以摒弃晦涩难懂的汇编语言,在不需要了解底层寄存器的操作细节的情况下,用C语言就可以完成我们需要的功能。所有这些特点使得我们学习ARM处理器的门槛得以降低。同时建议大家尽量去用固件。而不是避开固件自己写代码。因为在实际的项目,代码成百上千个,不可能都自己来写,调用固件的函数来完成,才是可行的方案。当然我们在深入的情况下,透彻理解寄存器的操作是必要的,也是值得的,高效编程也必须在这方面努力。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧