2017-02-05 34 views
6

Clangを使用してCアプリケーションをLinux(64ビット)からWindows(64ビット)にクロスコンパイルしようとしています。私はpage on cross-compilationを読んでいましたが、あまり役に立ちませんでした。簡単なテストとして、私はtest.cで次のコードClangを使用してLinuxからWindowsへクロスコンパイル

を持っている:

#include <stdio.h> 

int main() 
{ 
     puts("hello world"); 
     return 0; 
} 

を私の最高の推測では、これまでのところclang -o test -target x86_64-win64-?ABI? test.cです。しかし、私はABI Windows 64ビットが何を使用しているのか分かりません。私がターゲットのトリプルx86_64-win64-abcdefgを使ってclangを実行すると、コンパイルがうまくいくように見えます。つまり、エラーなしで終了し、やや有効なバイナリを生成します。 abcdefgは間違いなく有効なABIではないと考えても意味がありません。結果として得られるバイナリは、このような小さなプログラムでは大きすぎるので、Windowsは16ビットプログラム(???)だと思っているようです。それを逆アセンブルすると "linux"と "gnu"への参照が明らかになるので、ClangはWindows用にコンパイルしようとしていないようです。

ターゲットのwin32(x86_64-win32-???ABI???)次のエラーメッセージが表示されます私は間違っていない場合

test.c:1:10: fatal error: 'stdio.h' file not found 
#include <stdio.h> 
     ^
1 error generated. 

このエラーは、システムファイルを検索する場所を知っていないことの結果です。クロスコンパイルできると主張しているので、ClangはWindowsヘッダーファイルをどこかに格納していると仮定します。しかしここで?そうでない場合は、どこかでダウンロードできますか?

ABIのClangがサポートしているアーキテクチャやシステムのリストはありますか?クロスコンパイルページのリストは包括的ではありません。

このページでは-mcpu=...を使用することも示唆していますが、古いことが警告されています。代わりに、警告が推奨するように、私は-mtune=x86_64を試しました。これは効果がないようです。アーキテクチャはターゲットのトリプルで指定されているので、これは必要ですか?

LLVMの実験的リンカーlldが必要であることを示唆する文献があります。これは本当ですか?私はlldを編集するいくつかの問題を抱えており、可能ならばそれを避けたいと思っています。

+1

"blangのように、Clangが知らないパラメータを選択した場合、無視され、不明と判断されるため、常に望ましいとは言えませんので、注意してください._"これはおそらく 'abcdefg' 。 – DyZ

+0

@DYZああ、ありがとう。有効なパラメータのリストまたはそれがわからないことを示すメッセージがある場合のみ! – RogueCSDev

+0

答えはありませんが、https://github.com/tpoechtrager/wclangが見つかりました。まだ試していません。 "Linux/Unix上でclangを使って簡単にソースコードをクロスコンパイルする" –

答えて

1

私はwindows 10マシンにmobaxtermをインストールしました。無料版があります。 xserverを提供します。これにはcygwinのインストールが含まれており、ローカル端末を起動することができます。 apt-get install clangとclangはコンパイルする準備ができていてstdio.hを見つけて不平を言わずに見つけます。

しかし、結果の実行ファイルをmobaxterm/cygwinではなくWindows自体の中で実行する場合は、代わりにmingwinを使ってコンパイルする必要があります。

関連する問題