2011-10-17 5 views
3

DコードをCとリンクするための簡単なテストを設定しましたが、リンカの問題が発生しています。このD-to-Cリンケージで何が問題になっていますか?

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のアーキテクチャを指定して試してみたが、それはで私にバスエラーを与える:

// 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を吐き出しますランタイム。私は前にバスのエラーを取得したことはないので、ちょうど私の頭の上に行く。

私は間違って何をしていますか?

+1

よくできていないファイル形式..ここでは明らかにキャプテンではありませんが、gccのためにDでコンパイルしてみてください(gdcと思います) – fazo

+0

@fazoなぜそれが必要でしょうか? Dウェブサイトはそれほど多くの努力をすることなく(http://www.d-programming-language.org/interfaceToC.html)行うことができます。 – Maxpm

+0

これはc <->のC++インターフェイスではなく、互換性のないコンパイラで作成されたDオブジェクトとc/C++オブジェクトとの相互運用性についてのものではありません。 – fazo

答えて

5

32bit 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

Digital MarsコンパイラとGCCコンパイラは、異なるオブジェクトファイル形式を使用します。 (gdcとgcc)または(dmdとdmc)を使用してください。

+0

これを「正式な」ライブラリ、すなわち 'libFoo.a'に入れることで回避できますか? – Maxpm

+0

わかりませんが、私はそれを疑っています。しかし、動的にリンクされたライブラリ(.dll、または.so)はおそらく動作するはずです。 – cyco130

+0

私が何か間違っていない限り、ダイナミックライブラリはうまくいきません。同じエラー。 – Maxpm

関連する問題