Неопределенная ссылка на std :: nothrow в libsupc ++. A из newlib - PullRequest
0 голосов
/ 03 апреля 2020

Теперь я пытаюсь скомпилировать Nuttx с помощью libc ++, используя набор инструментов arm-none-eabi. Большинство вещей в порядке, однако некоторые приложения C ++ имеют неопределенную ссылку на std::nothrow. Я обнаружил, что std::nothrow кажется определенным в libsupc++.a в наборе инструментов:

new_handler.o:
00000000 b (anonymous namespace)::__new_handler
00000000 T std::get_new_handler()
00000000 T std::set_new_handler(void (*)())
00000000 R std::nothrow

Я уверен, что libsupc++.a связано с моим приложением. Мое приложение ссылается на std::nothrow следующим образом:

U nothrow

Я полагаю, что неопределенная ссылка произошла из-за несоответствия ч / б этих имен, у одного есть пространство имен, у другого нет пространства имен. Как я могу исправить это несоответствие пространства имен?

Вот моя командная строка ссылки:

arm-none-eabi-ld --entry=__start -nostartfiles -nodefaultlibs -g -Map=/usr/src/uros_ws/firmware/spresense/sdk/nuttx.map --cref --defsym __stack=_vectors+1572864 -T/usr/src/uros_ws/firmware/spresense/sdk/bsp/scripts/ramconfig.ld -L"/usr/src/uros_ws/firmware/spresense/sdk/lib" -L"/usr/src/uros_ws/firmware/spresense/sdk/bsp/board"  -L"/usr/src/uros_ws/firmware/spresense/sdk/bsp" \
-o "/usr/src/uros_ws/firmware/spresense/sdk/nuttx"   \
--start-group -lbsp -lsystem -lextdrivers -llte -lexamples -lapps -lsched -ldrivers -lconfigs -lc -lmm -larch -lcxx -lapps -lnet -lfs -lbinfmt -lgraphics -lnx -lcxx -lboard "/usr/local/bin/../lib/gcc/arm-none-eabi/7.3.1/../../../../arm-none-eabi/lib/thumb/v7e-m/fpv4-sp/hard/libm.a"  -lsupc++ "/usr/local/bin/../lib/gcc/arm-none-eabi/7.3.1/thumb/v7e-m/fpv4-sp/hard/libgcc.a" --end-group

1 Ответ

0 голосов
/ 05 апреля 2020

Вам придется переименовать способ, которым вы ссылаетесь на nothrow в своем приложении. Файл .a - это уже скомпилированная библиотека, поэтому, если вы не сможете изменить его и скомпилировать снова, он не подлежит изменению (отсюда символы и ссылки).

Компилятор использует пространство имен для создания уникальные ссылки ( имя искажения , проверьте этот пример https://godbolt.org/z/cPkvxm). Поэтому вам придется использовать std::nothrow (с определенным пространством имен), в противном случае вы вызываете другой (и, вероятно, неопределенный) символ.

Если nothrow не включает пространство имен, вы будет иметь возможность использовать его, как вы делаете сейчас, однако, если в будущем вы решите создать свой собственный nothrown, у вас будет конфликт (легко решить, но это требует времени и таких вещей, как nothrownCustom / Customnothrown / nothrown_custom / et c вместо Custom :: nothrown).

PD: использование пространства имен для всего файла очень легко исправить, но прежде чем сделать это, взгляните на этот пост: Почему это "использование пространства имен std;" считается плохой практикой?

...