Что не так с этой связью D-to-C? - PullRequest
3 голосов
/ 17 октября 2011

Я настроил тривиальный тест для связи кода D с C, но у меня проблемы с компоновщиком.

// Compiled with "gcc -c CTest.c."

void SayHello()
{
    printf("%s", "Hello, world!");
}

// Compiled with "dmd DTest.d CTest.o."

extern (C) void SayHello();

void main()
{
    SayHello();
}

ld выплевывает:

ld: warning: in CTest.o, file was built for unsupported file format which is not the architecture being linked (i386)
Undefined symbols:
  "_SayHello", referenced from:
    __Dmain in DTest.o
ld: symbol(s) not found

Я пытался вручную указать архитектуру CTest.c с помощью -m32 -march=i386, но это дает мне ошибку шины во время выполнения.Я никогда раньше не сталкивался с ошибкой в ​​автобусе, так что это просто у меня над головой.

Что я делаю неправильно?

Ответы [ 2 ]

5 голосов
/ 18 октября 2011

Я предполагаю, что у вас установлен 32-битный dmd. Ваша первоначальная попытка изменить gcc кажется правильной, возможно, попробуйте удалить опцию -march. В противном случае попробуйте компиляцию D с -m64, затем попробуйте -m32, если она не сработала.

Да, dmd может связываться с созданными GCC объектными файлами, ориентированными на формат Linux ELF, и я считаю MacOS / BSD? Мартовский формат. Windows DMD производит OMF, в то время как COFF сейчас более популярен.

0 голосов
/ 17 октября 2011

Компиляторы Digital Mars и компиляторы GCC используют разные форматы объектных файлов.Либо используйте (gdc и gcc), либо (dmd и dmc).

...