Я также экспериментировал с GDC из исходных текстов в режиме -v2 для компиляции библиотеки, пытаясь связать некоторые функции D с приложением C ++.
Я обнаружил ту же проблему с отсутствующей ссылкой на _tlsstart и _tlsend.
Частичным решением является включение в библиотеку «основной» функции:
void main(){}
Я работаю со статической библиотекой на Linux. Я проверил полученную статическую библиотеку с:
nm libDexample.a
Это показывает, что вышеприведенный тривиальный main вставляет дополнительные символы в libDexample.d (который также заканчивается в исполняемом файле c ++):
_Dmain
_tlsend
_tlsstart
Конечно, эти символы дают ошибки связи, относящиеся к множественным определениям, если библиотека используется в приложении D. Следовательно, вы можете определить отдельную библиотеку, например, libtls.d, содержащую:
extern(C) void make_it_link_please(){}
//inserts the _tlsstart and _tlsend stuff???????
void main()
{
}
Где можно ссылаться на libtls в случае приложения c ++, но не приложения D.