LINUX.ORG.RU

DMD interface to C

 , , ,


0

1

Здравствуйте!

Есть файл main.d со следующим содержанием:

  extern(C) void main(uint magic, uint addr)
  {
     int x;
     int y;
     // ну что там еще.. не важно что.
  }

Пытаюсь сделать следующее:

  dmd -m32 -c main.d  // На выходе получаем main.o
  gcc -m32 -o main main.o
Но получаю такую ошибку:

main.o: In function `no symbol': ./main.d:(.text+0x6): undefined reference to `_Dmodule_ref' collect2: error: ld returned 1 exit status

Подскажите что делать. Заранее спасибо.

Ответ на: комментарий от sargis286

gcc -lphobos2 -m32 -o main main.o

Я бы написал gcc -m32 -o main main.o -lphobos2

Вываливается куча ошибок

Возможно, D непригоден для линковки обычным ld.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Как мне слинковать код на ассемблере и код на D? Допустим делаю так:

   nasm -f elf -o start.o start.asm

потом

 
   dmd -m32  -c -d main.d
В итоге мне нужно слинковать файл main.o и start.o. Как это сделать не подскажите?

sargis286
() автор топика

А разве gcc может линковать откомпиленое dmdшкой? ЗЫ gdc не хочешь попробовать?

erfea ★★★★★
()
Ответ на: комментарий от sargis286

а сделай теперь gdc -v helloworld.d и посмотри, что он на самом деле вызывает. А так да, ставлю на то, что не линкуется phobos2 и druntime. dmd -v ...

anonymous
()
Ответ на: комментарий от tailgunner

Возможно, D непригоден для линковки обычным ld.

пригоден. dmd на винде использует OPTLINK (из Zortech C++/Symantec C++/Digital Mars C++), а на юниксах пользуется обычным *.o через gcc и LD.

anonymous
()

Подскажите что делать. Заранее спасибо.

не назвать main, а назвать myC_main. Например, как поступают с виндой: https://github.com/AndrejMitrovic/DWinProgramming/blob/master/Samples/Chap01/... — обрати внимание на extern (Windows) int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) — обёртку над int myWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow)

в С++ такая же ерунда получится, если ты попробуешь линковать с С++-ным main, но без инициализации C++ runtime library (запуск конструкторов и деструкторов): http://wiki.osdev.org/C++#Start-up_code

anonymous
()

main.o: In function `no symbol': ./main.d:(.text+0x6): undefined reference to `_Dmodule_ref'

ну правильно. Потому что D-шный main имеет другой прототип и зависимости от Druntime (ООП, рефлексия, информация о типах классов). Когда ты пишешь на D хелловорд с обычным прототипом, эти зависимости удовлетворяются. Когда пишешь свой велосипед с тем же именем (С ABI + C прототип, кстати, тоже неправильный для main()) — они не удовлетворяют D-шному ABI на main и его прототип.

В принципе, можно сделать свой D runtime с другими зависимостями, но это тебе не надо. Есличо, см. пример с виндовым WinMain и/или, исходники Xombb (это ОС на D): http://wiki.osdev.org/D_bare_bones

Но тебе это не надо. Чего ты вообще пытаешься достичь? Алсо, посмотри пример с dll-ками под винду https://github.com/D-Programming-Language/dmd/tree/master/samples/mydll или https://github.com/D-Programming-Language/dmd/tree/master/test/win32

anonymous
()
Ответ на: комментарий от anonymous

благодарю за ответы. теперь куча информации, которую надо изучить. займусь этим))

sargis286
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.