Инструмент D ddemangle.d не изменяет выходные данные ошибок связывания DMD+GNU ld

Я пытаюсь исправить свои ошибки связывания, такие как

dmd -debug -gc -unittest -D -Dd/home/per/.emacs.d/auto-builds/dmd/Debug-Boundscheck-Unittest/home/per/Work/cognia/ -w  ~/Work/cognia/t_geometry.d -of/home/per/.emacs.d/auto-builds/dmd/Debug-Boundscheck-Unittest/home/per/Work/cognia/t_geometry
/home/per/.emacs.d/auto-builds/dmd/Debug-Boundscheck-Unittest/home/per/Work/cognia/t_geometry.o:(.data+0x6d8): undefined reference to `_D4gl3n6linalg12__ModuleInfoZ'
/home/per/.emacs.d/auto-builds/dmd/Debug-Boundscheck-Unittest/home/per/Work/cognia/t_geometry.o: In function `_D4gl3n6linalg16__T6VectorTfVi4Z6Vector19__unittestL103_7189FNaNbNfZv':
/home/per/Work/cognia/gl3n/linalg.d:104: undefined reference to `_D4gl3n6linalg15__unittest_failFiZv'
/home/per/Work/cognia/gl3n/linalg.d:105: undefined reference to `_D4gl3n6linalg15__unittest_failFiZv'

используя ddemangle.d из репозитория dtools на github как

same_command_as_above | ddemangle

но я получаю тот же результат, используя как DMD 2.063.2, так и git master.

ddemangle.d не обновляется?

Обновление: хорошо. Спасибо!

same_command_as_above 2>&1 | ddemangle

demangles большинство сообщений, но не все из них. Интересно, почему. Вот несколько строк

/home/per/Work/cognia/gl3n/linalg.d:1814: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi2Vi2Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi2Vi2Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:1815: undefined reference to `void gl3n.linalg.__unittest_fail(int)'

Подсказки кто-нибудь?


person Nordlöw    schedule 28.08.2013    source источник


Ответы (2)


Убедитесь, что вы фильтруете поток вывода, который испускает программа. Ошибки обычно записываются в стандартный поток ошибок, но строка выше фильтрует только стандартный поток вывода.

Попробуйте изменить команду на:

same_command_as_above 2>&1 | ddemangle

2>&1 перенаправит stderr в stdout, позволяя ddemangle фильтровать как stdout, так и stderr.

person Vladimir Panteleev    schedule 28.08.2013

Ok. Спасибо!

same_command_as_above 2>&1 | ddemangle

demangles большинство сообщений, но не все из них. Интересно, почему. Вот несколько строк

/home/per/Work/cognia/gl3n/linalg.d:1814: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi2Vi2Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi2Vi2Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:1815: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:1817: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:1818: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:1820: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:1821: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'
/home/per/Work/cognia/gl3n/linalg.d:1823: undefined reference to `void gl3n.linalg.__unittest_fail(int)'
/home/per/Work/cognia/gl3n/linalg.d:695: undefined reference to `_D4gl3n6linalg19__T6MatrixTfVi4Vi4Z6Matrix6__initZ'

Подсказки кто-нибудь?

person Nordlöw    schedule 28.08.2013
comment
Символы __initZ содержат значение по умолчанию для типа (которое используется для инициализации новых значений). В языке это соответствует неявному свойству .init всех типов. В настоящее время они не разобраны — см. ошибка 10189. - person Vladimir Panteleev; 29.08.2013
comment
Кстати, в будущем вы должны опубликовать поправки к своему вопросу, отредактировав свой вопрос и оставив комментарий к ответу, на который вы следуете. - person Vladimir Panteleev; 29.08.2013