CooCox論壇上時(shí)不時(shí)有人問:CoIDE是否支持C++?
CoIDE默認(rèn)支持C語言,工程中的*.cpp或*.C(大寫的C,會(huì)默認(rèn)為cpp文件)不參與編譯。這讓不少慣用C++的用戶覺得可惜。
好在這個(gè)世界上解決問題的方法永遠(yuǎn)比問題多得多,感謝用戶Yury Kuchura的貢獻(xiàn)和分享,現(xiàn)在只需要幾處改動(dòng),CoIDE中就能使用C++了。步驟如下:
1. 修改build.xml文件,使*.cpp文件能被編譯
2. 修改link.ld文件,使連接時(shí)C++所需的段能被識(shí)別
/* Section Definitions */
SECTIONS
{
.text :
{
KEEP(*(.isr_vector .isr_vector.*))
*(.text .text.* .gnu.linkonce.t.*)
*(.glue_7t) *(.glue_7)
*(.rodata .rodata* .gnu.linkonce.r.*)
/* C++ Static constructors/destructors (eabi) */
. = ALIGN(4);
KEEP(*(.init))
. = ALIGN(4);
__preinit_array_start = .;
KEEP (*(.preinit_array))
__preinit_array_end = .;
. = ALIGN(4);
__init_array_start = .;
KEEP (*(SORT(.init_array.*)))
KEEP (*(.init_array))
__init_array_end = .;
. = ALIGN(4);
KEEP(*(.fini))
. = ALIGN(4);
__fini_array_start = .;
KEEP (*(.fini_array))
KEEP (*(SORT(.fini_array.*)))
__fini_array_end = .;
/* C++ Static constructors/destructors (elf) */
. = ALIGN(4);
_ctor_start = .;
KEEP (*crtbegin.o(.ctors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
KEEP (*(SORT(.ctors.*)))
KEEP (*crtend.o(.ctors))
_ctor_end = .;
. = ALIGN(4);
KEEP (*crtbegin.o(.dtors))
KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
KEEP (*(SORT(.dtors.*)))
KEEP (*crtend.o(.dtors))
} > rom
.ARM.extab :
{
*(.ARM.extab* .gnu.linkonce.armextab.*)
} > rom
…
…
/* stack section */
.co_stack (NOLOAD):
{
. = ALIGN(8);
*(.co_stack .co_stack.*)
} > ram
__exidx_start = .;
.ARM.exidx :
{
*(.ARM.exidx* .gnu.linkonce.armexidx.*)
} > rom
__exidx_end = .;
. = ALIGN(4);
_end = . ;
}
3. 修改啟動(dòng)代碼,使構(gòu)造和析構(gòu)函數(shù)能被正確調(diào)用
…
extern unsigned long __preinit_array_start;
extern unsigned long __preinit_array_end;
extern unsigned long __init_array_start;
extern unsigned long __init_array_end;
extern unsigned long _ctor_start;
extern unsigned long _ctor_end;
static void call_constructors(unsigned long *start, unsigned long *end) __attribute__((noinline));
static void call_constructors(unsigned long *start, unsigned long *end)
{
unsigned long *i;
void (*funcptr)();
for ( i = start; i < end; i++)
{
funcptr=(void (*)())(*i);
funcptr();
}
}
…
void Default_Reset_Handler(void)
{
…
/* Setup the microcontroller system. */
SystemInit();
//Initialize CoOS (in order the new/delete operators to work properly
//prior to calling constructors). Comment it out if you don't use CoOS!
CoInitOS();
//Call C++ global constructors
call_constructors(&__preinit_array_start, &__preinit_array_end);
call_constructors(&__init_array_start, &__init_array_end);
call_constructors(&_ctor_start, &_ctor_end);
/* Call the application's entry point.*/
main();
}
4. 在組件頁勾選C Library和Retarget printf,之后注釋掉printf.c文件中的如下語句,以避免重定義_impure_ptr
struct _reent *_impure_ptr = &r;
5. 在工程配置(Project configuration)中添加Linked Libraries libstdc++和libsupc++,它們可以從GCC tool chain的庫中找到
來源:
http://www.coocox.org/Forum/topic.php?id=730
http://www.coocox.org/Forum/topic.php?id=873
例程:
103vb_cpp.zip
(220.71 KB)
2012-3-18 22:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 積分 -1
STM32103vb + CoIDE 1.3.1 + 閃燈
說明——因CoIDE 1.4.0存在bug“修改build.xml文件后無法保存”,故使用CoIDE 1.3.1版本。此bug在新版CoIDE中將被修復(fù)。
歡迎大家常來CooCox論壇交流討論~ |