2011-10-17 24 views
3

我已經設置了一個簡單的測試來鏈接D代碼與C,但我遇到了鏈接器問題。這個D-to-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 

我已經試過手動指定與-m32 -march=i386CTest.c的架構,但是這給了我一個總線錯誤的運行。我以前從來沒有遇到過一次巴士的錯誤,所以這只是我的頭腦。

我在做什麼不正確?

+1

well ..非端口文件格式..不是在這裏明顯的船長,但嘗試編譯D前端gcc(gdc我認爲) – fazo

+0

@fazo爲什麼這將是必要的? D網站[說可以完成](http://www.d-programming-language.org/interfaceToC.html),沒有額外的努力。 – Maxpm

+0

這不是關於C++接口,而是使用不兼容的編譯器生成的D和c/C++對象之間的互操作性。 – fazo

回答

5

我打算假設你已經安裝了32位dmd。您最初嘗試更改gcc似乎是正確的,也許嘗試刪除-march選項。否則,請使用-m64嘗試D編譯,如果不起作用,請嘗試使用-m32。

是的,dmd可以鏈接到針對Linux ELF格式的GCC生成的目標文件,我相信MacOS/BSD? 3月格式。 Windows DMD生成OMF,而COFF現在更受歡迎。

+0

滴下'-march'的竅門!我敢問爲什麼這有效嗎? – Maxpm

+0

這裏有比你想知道的有關將D鏈接到C更多的信息。最主要的是我的線程本地存儲。希望你找到有用的東西。 http://stackoverflow.com/q/7774365/978992 – 1100110

+0

我不確定什麼-march應該做的(優化?),但我從來沒有用過它自己。 –

-3

數字火星編譯器和GCC編譯器使用不同的目標文件格式。可以使用(gdc和gcc)或(dmd和dmc)。

+0

我可以通過將它放在一個「正式」庫,即'libFoo.a'中來解決這個問題嗎? – Maxpm

+0

不確定,但我懷疑它。但動態鏈接庫(.dll或.so)應該可以工作。 – cyco130

+0

除非我再犯錯誤,否則動態庫也不起作用。同樣的錯誤。 – Maxpm