ESP8266 NONOS SDK: Как скомпилировать код C ++? - PullRequest
0 голосов
/ 04 сентября 2018

ESP8266 NONOS SDK: Как скомпилировать код C ++?

Я почему-то не могу скомпилировать код C ++ с помощью ESP8266 NONOS SDK. Я использую gen_misc.sh -скрипт для настройки и компиляции программы, но выводит следующую ошибку:

start...

make[1]: Entering directory '/repos/esp/ESP8266_NONOS_SDK/diplomarbeit-firmware/user'
xtensa-lx106-elf-g++ -Os -g -Wpointer-arith -Wundef -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -ffunction-sections -fdata-sections -fno-builtin-printf  -DICACHE_FLASH -DSPI_FLASH_SIZE_MAP=3   -I include -I ./ -I ../../include/ets -I ../include -I ../../include -I ../../include/eagle -I ../../driver_lib/include  -o .output/eagle/debug/obj/user_main.o -c user_main.cpp
xtensa-lx106-elf-ar ru .output/eagle/debug/lib/libuser.a .output/eagle/debug/obj/user_main.o
make[1]: Leaving directory '/repos/esp/ESP8266_NONOS_SDK/diplomarbeit-firmware/user'
xtensa-lx106-elf-gcc  -L../lib -nostdlib -T../ld/eagle.app.v6.ld -Wl,--no-check-sections -Wl,--gc-sections -u call_user_start -Wl,-static -Wl,--start-group -lc -lgcc -lhal -lphy -lpp-lnet80211 -llwip -lwpa -lcrypto -lmain -ldriver user/.output/eagle/debug/lib/libuser.a -Wl,--end-group -o .output/eagle/debug/image/eagle.app.v6.out
../lib/libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x6a0): undefined reference to `user_pre_init'
../lib/libmain.a(app_main.o): In function `user_uart_wait_tx_fifo_empty':
(.irom0.text+0x6b8): undefined reference to `user_init'
../lib/libmain.a(app_main.o): In function `flash_data_check':
(.irom0.text+0x718): undefined reference to `user_pre_init'
../lib/libmain.a(app_main.o): In function `flash_data_check':
(.irom0.text+0xac1): undefined reference to `user_init'
collect2: error: ld returned 1 exit status
../Makefile:398: recipe for target '.output/eagle/debug/image/eagle.app.v6.out' failed
make: *** [.output/eagle/debug/image/eagle.app.v6.out] Error 1

Мой код выглядит так:

user_main.cpp

#include "user_interface.h"
#include "osapi.h"
#include "partition.h"

void ICACHE_FLASH_ATTR user_pre_init ()
{
    // register partition table here
    if (!system_partition_table_regist(partition_table,
    sizeof(partition_table) / sizeof(partition_table[0]),
    SPI_FLASH_SIZE_MAP))
    {
        os_printf("FAIL TO REGISTER PARTITION TABLE");
        while (1) {}

    } 
}

class MyClass {
};

void user_init ()
{
    os_printf("Hello world!\n");
}

Я действительно не знаю, как решить эту проблему.

1 Ответ

0 голосов
/ 06 сентября 2018

Заголовочные файлы, которые вы включаете, являются заголовочными файлами C, а не C ++. Компилятор C ++ будет манипулировать именами функций, что приведет к указанной выше ошибке. Вам нужно обернуть их во внешний блок, например, чтобы компилятор не искажал их:

extern "C" {
   #include "user_interface.h"
   #include "osapi.h"
   #include "partition.h"
}
...