stm32f4 g++错误,涉及newlib _kill_r、_kill、_getpid_r、_getpid、
stm32f4 g++ error involving newlib _kill_r,_kill, _getpid_r, _getpid,
在stm32f4微芯片上编译c++代码时遇到问题。
目标
我正在努力实现以下几点:
- 编译C++代码到stm32f4发现(已经完成成功地完成了一个基本程序[通过构造函数的实现以及其他c++特定功能])
- 使用ST提供的外围设备库编写代码(在这种情况下,我使用USART功能)
- 使用GNU工具使用商业IDE编译out代码(这是一项学习任务)
问题
我有两个项目设置,一个是c项目,将正确编译。我还用这个项目的输出闪存了stm32f4,它已经正确运行了。第二个项目使用相同的代码,对C++编译器的make文件和文件名进行了细微的更改(代码没有差异)。C项目成功编译,C++项目抛出错误。
这两个项目及其在终端上的输出都可以在这里找到:https://dl.dropboxusercontent.com/u/32204435/USART.tar.gz
设置
我使用的是Ubuntu 12.04.3 LTS 64位。我已经按照本网站上的说明安装了arm none-eabi工具链:视频。se/2012/07/get-与-stm32f4-在ubuntu-nux/上启动
信息与分析
据我所知,在arm-none-eabi-g++编译器中支持newlib时出现了一个错误。我不明白为什么会出现错误,因为这两个项目之间没有代码差异。像printf这样的newlib函数在使用时也会产生类似的错误。在USART示例中,我限制了项目使用newlib的任何可能性(唯一的例外是数据类型)。错误似乎不是由newlib引起的,而是由丢失的硬件头(或称为newlib存根)(syscalls.h)引起的
有人能在C++支持下帮助构建这个项目吗?甚至可以提供一个在newlib中无错误使用代码的解决方案(比如printf[或者,我知道有一个很大的问题,来自iostream的cout])?
我仍在学习,我17岁了,没有老师(自我驱动),所以可能看起来缺乏经验,我就是:)预计会有知识差距。
圣诞快乐!
在Makefile上向te CFLAGS添加-fno rtti和-fno异常。
或者,您可以将此破解添加到编译文件
extern "C" int __aeabi_atexit(void *obj, void (*dtr)(void *), void *dso_h) {
(void) obj;
(void) dtr;
(void) dso_h;
return 0;
}
void *__dso_handle = 0;
/**
* This is an error handler that is invoked by the C++ runtime when a pure virtual function is called.
* If anywhere in the runtime of your program an object is created with a virtual function pointer not
* filled in, and when the corresponding function is called, you will be calling a 'pure virtual function'.
* The handler you describe should be defined in the default libraries that come with your development environment.
*/
extern "C" void __cxa_pure_virtual() {
while (1)
;
}
namespace __gnu_cxx {
void __verbose_terminate_handler() {
while(1)
;
}
}
这将禁用异常检查上的信号跟踪。
好黑客!
对于rtti和异常的使用,您需要定义一些系统调用实现:
在我的编译器(gcc-arm嵌入式4.8+newlib nano)中,这个解决方法可以很好地工作(添加到名为src/hack.cpp的新文件):
extern "C" int __aeabi_atexit(void *obj, void (*dtr)(void *), void *dso_h) {
return 0;
}
/* Enable if your stub don't provide dso handle symbol */
#if 0
void *__dso_handle = 0;
#endif
extern "C" void __cxa_pure_virtual() {
while (1)
;
}
namespace __gnu_cxx {
void __verbose_terminate_handler() { while(1) ; }
}
extern "C" int _getpid(void) {
return 1;
}
extern "C" void _kill(int pid) { while(1) ; }
extern "C" int _end;
static char *end_of_data = (char *) &_end;
/*
* WARNING: No stack/heap colition check.
* For check colition and stack growing overflow use SP register value
* or RAM end limit depeding of processor architecture
*/
extern "C" char *_sbrk (int delta) {
char *ptr = end_of_data;
end_of_data += delta;
return ptr;
}
如果未定义的符号(如_write或_isatty)仍然存在问题,请将-lnosys添加到链接器标志中。
生成的可执行文件比非异常版本稍胖。(大约8K)但如果你需要例外情况,并且rtti机制在带有1M闪存的Cortex-M4上的开销很小
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 为什么if(fork()==0){getpid()}和popen()进程返回相同的进程id
- 在 C++11 中,signal.h 标头没有 kill 函数
- kill syscommand 在 Catch2 测试用例中失败
- QThread::terminate vs kill
- 程序是否可以在调用kill函数之前返回/终止
- 来自 c++ 的 Android kill子进程失败
- Qt Programming - QtConcurrence kill thread
- Linux Kill()错误出乎意料
- C++线程在kill之后仍然活着
- 如果存在进程,是否保证 kill(pid, 0) 返回 0
- QProcess::kill() 和 QProcess::terminate() 有什么区别?
- 在linux上链接库时,无法识别的选项--kill at
- 如何将 "kill -3 <jvm pid>" 标准输出单独重定向到 linux 和 unix 中的文件?
- 需要当前进程的PID, getpid()返回-1
- 带有SIGTERM的kill()系统调用不起作用
- 如何在c中获取进程ID,没有实现getpid()
- 在C++中,fork和kill并没有杀死所有的子进程
- kill-3用于solaris上的C++应用程序
- C + + Kill进程窗口标题