如何配置xtensa-lx106-elf使用nonos-sdk编译esp8266的C ++代码?

时间:2018-08-13 23:02:32

标签: c++11 cmake sdk esp8266

我很难用xtensa-lx106-elf编译c ++代码。

我正在使用的芯片(esp8266)的制造商提供一个sdk(nonos-sdk)。 该sdk中的一个库实现了在芯片中分配内存的函数: os_malloc os_realloc 等。

编译 c 代码时,一切正常。编译 c ++ 时,成功生成了目标文件,但是从链接器中收到很多错误消息,抱怨未定义的对 abort free 的引用。 , malloc __ gxx_personality_v0 的一个非常奇怪的人。

我的make文件是使用cmake创建的。下面是我在编译器中使用的选项。

target_include_directories( 
  ${elf_file}

  PUBLIC
  src/
  inc/
  /opt/esp-open-sdk/sdk/driver_lib/include/
  /opt/esp-open-sdk/sdk/include/
  )

target_compile_options(
  ${elf_file}

  PUBLIC
  -mlongcalls -c -std=c++11 -v
  )

target_link_libraries( 
  ${elf_file}

  PUBLIC

  -L/opt/esp-open-sdk/sdk/lib
  -L/opt/esp-open-sdk/sdk/ld
  -Teagle.app.v6.ld

  -nostdlib

  -Wl,--start-group
    -lmain -lhal -lnet80211 -lcrypto -lupgrade -lwpa -llwip -lpp -lphy -v
  -Wl,--end-group

  -ldriver
  -lcirom
  -lgcc
  )

编译器错误:

CMakeFiles/MasterSPI-esp8266.elf.dir/src/main.cpp.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
CMakeFiles/MasterSPI-esp8266.elf.dir/src/spi.cpp.o:(.eh_frame+0x12): undefined reference to `__gxx_personality_v0'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o):(.literal+0x8): undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o): In function `execute_cfa_program':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2.c:1212: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o): In function `read_encoded_value_with_base':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-pe.h:252: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o): In function `execute_stack_op':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2.c:905: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o): In function `uw_update_context_1':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2.c:1420: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2.o):/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2.c:1560: more undefined references to `abort' follow
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o):(.literal+0x20): undefined reference to `malloc'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o):(.literal+0x24): undefined reference to `free'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `size_of_encoded_value':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-pe.h:88: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `read_encoded_value_with_base':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-pe.h:257: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `base_from_object':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:256: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `start_fde_sort':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:409: undefined reference to `malloc'
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:412: undefined reference to `malloc'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `end_fde_sort':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:575: undefined reference to `abort'
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:590: undefined reference to `free'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `__register_frame':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:118: undefined reference to `malloc'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `__register_frame_table':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:156: undefined reference to `malloc'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `__deregister_frame_info_bases':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:200: undefined reference to `free'
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:216: undefined reference to `abort'
/opt/esp-open-sdk/sdk/lib/libgcc.a(unwind-dw2-fde.o): In function `__deregister_frame':
/home/wjg/Repo/esp-open-sdk-20170622/crosstool-NG/.build/src/gcc-4.8.5/libgcc/unwind-dw2-fde.c:231: undefined reference to `free'

引起我注意的是,链接器似乎正在尝试在路径中找到许多文件:“ / home / wjg / Repo / ”,并且我可以确认它在以下目录中不存在我的电脑。无法理解这种行为。


工具信息:

操作系统:Ubuntu 16.04LTS

编译器:xtensa-lx106-elf-g ++(crosstool-NG crosstool-ng-1.22.0-60-g37b07f6)4.8.5

CMake :cmake版本3.12.0-rc3

nonos-sdk :2.2.1

1 个答案:

答案 0 :(得分:0)

也许您忘了链接C ++库了?这些是我在ESP8266上链接我的C ++文件时使用的库:

-lhal -lphy -lpp -lnet80211 -llwip2 -lwpa -lcrypto -lmain -lwps \
-laxtls -lespnow -lsmartconfig -lairkiss -lwpa2 -lstdc++ -lm -lc -lgcc

尤其是-lstdc ++很重要!尝试将这些库添加到您的makefile中!