Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > undefined reference to `__assert_fail'


Автор: marcusmae 11.7.2008, 23:00
Здравствуйте,

Извините, если глупый вопрос... Я знаю, что сабж живёт в glibc, но не знаю, как его подключить smile  Какую опцию нужно указать?

Спасибо.

Автор: bsa 11.7.2008, 23:32
marcusmae, glibc не надо подключать (ну если очень хочется - параметр -lc), так как подключается по умолчанию.
Ты случаем левых параметров (типа -nostdlib и -nodefaultlibs) не использовал?

Автор: marcusmae 11.7.2008, 23:37
Код

/usr/bin/ccache /opt/cell/toolchain/bin/spu-g++        -W -Wall -Winline -Wno-main  -I. -I../../ -I../../../Common -I../..
/../NumericalFramework -I../../../Transport -I/usr/include -I/opt/cell/sysroot/usr/include  -I /opt/cell/sysroot/usr/spu/include -I /opt/cell
/sysroot/opt/cell/sdk/usr/spu/include  -O3 --param max-unroll-times=1 -fno-exceptions -fno-rtti -c TestingUnitSPE.cpp


и

Код

/usr/bin/ccache /opt/cell/toolchain/bin/spu-g++ -o TestingUnitSPE  TestingUnitSPE.o      -L/opt/cell/sysroot/usr/spu/lib -L/opt
/cell/sysroot/opt/cell/sdk/usr/spu/lib -Wl,-N


-lc не помогает

Автор: JackYF 12.7.2008, 02:07
Несоблюдение версий библиотек?

Автор: marcusmae 12.7.2008, 12:31
Цитата(JackYF @  12.7.2008,  02:07 Найти цитируемый пост)
Несоблюдение версий библиотек?


JackYF, что имеется в виду? 32/64-битность?

Автор: JackYF 12.7.2008, 14:04
marcusmae, нет. Я имел в виду разных набор инклюдов, да и компилятор у тебя нестандартный (сужу по пути).

Автор: marcusmae 12.7.2008, 15:33
JackYF, хорошо, я умею проверять, какой хедер используется при компиляции. А как узнать, из какой библиотеки берётся __asser_fail при линковании?

Автор: JackYF 13.7.2008, 00:44
Цитата(marcusmae @  12.7.2008,  14:33 Найти цитируемый пост)
А как узнать, из какой библиотеки берётся __asser_fail при линковании? 

этого я не знаю smile по идее линкер должен сам всё разрулить smile

Автор: marcusmae 13.7.2008, 01:58
Мда, ну вот если ему подсовывать __assert.o или libc.a - не есть, говорит wrong format. Попробовать, может, присоединить исходник?..

Автор: Torsten 13.7.2008, 12:19
marcusmae, 
Цитата(marcusmae @  12.7.2008,  15:33 Найти цитируемый пост)
JackYF, хорошо, я умею проверять, какой хедер используется при компиляции. А как узнать, из какой библиотеки берётся __asser_fail при линковании?

Какая первая указана в путях к LIB - от той и берется. 

Автор: xvr 14.7.2008, 11:41
Цитата(marcusmae @ 11.7.2008,  23:37)
Код

/usr/bin/ccache /opt/cell/toolchain/bin/spu-g++        -W -Wall -Winline -Wno-main  -I. -I../../ -I../../../Common -I../..
/../NumericalFramework -I../../../Transport -I/usr/include -I/opt/cell/sysroot/usr/include  -I /opt/cell/sysroot/usr/spu/include -I /opt/cell
/sysroot/opt/cell/sdk/usr/spu/include  -O3 --param max-unroll-times=1 -fno-exceptions -fno-rtti -c TestingUnitSPE.cpp


и

Код

/usr/bin/ccache /opt/cell/toolchain/bin/spu-g++ -o TestingUnitSPE  TestingUnitSPE.o      -L/opt/cell/sysroot/usr/spu/lib -L/opt
/cell/sysroot/opt/cell/sdk/usr/spu/lib -Wl,-N


-lc не помогает

Судя по преффиксу это gcc для граф. сопроцессоров NVidia? (CUDA) У меня есть большие сомнения, что ей есть куда выводить сообщение из __asser_fail, равно как и сделать после этого abort  smile Так что вполне возможно реализации этого в libc просто нет, за бессмысленностью   smile Так что выхода 2:
  •  Написать свою функцию  __asser_fail (вот только что она должна делать для SPU?)
  •  Поставить при компиляции -DNDEBUG, все assert'ы отключатся

Автор: bsa 14.7.2008, 13:09
Подозреваю, что подключаются заголовочные файлы стандартной glibc.

Автор: xvr 14.7.2008, 19:30
Цитата(bsa @ 14.7.2008,  13:09)
Подозреваю, что подключаются заголовочные файлы стандартной glibc.

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

Автор: marcusmae 20.7.2008, 10:03
Цитата(xvr @  14.7.2008,  11:41 Найти цитируемый пост)
Судя по преффиксу это gcc для граф. сопроцессоров NVidia? (CUDA)


Ну вроде того : Cell Broadband Engine.

Цитата(bsa @  14.7.2008,  13:09 Найти цитируемый пост)
Подозреваю, что подключаются заголовочные файлы стандартной glibc.


Как мне объяснили,

Цитата

Код, который компилируется на spu не линкуется с glibc напрямую. Для glibc функций существуют callback, но не для всех функций. IBM в каждой новой версии SDK добавляет новые callback.


Цитата(xvr @  14.7.2008,  11:41 Найти цитируемый пост)
У меня есть большие сомнения, что ей есть куда выводить сообщение из __asser_fail, равно как и сделать после этого abort   Так что вполне возможно реализации этого в libc просто нет, за бессмысленностью


Примечательно, что assert не могут делать именно сопроцессоры, а на основном проце всё прекрасно работает. В то же время отладочная печать поддерживается всюду (проблемы с выводом нет).

Тему закрою - собственная реализация assert так или иначе решает проблему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)