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を編集するいくつかの問題を抱えており、可能ならばそれを避けたいと思っています。
"blangのように、Clangが知らないパラメータを選択した場合、無視され、不明と判断されるため、常に望ましいとは言えませんので、注意してください._"これはおそらく 'abcdefg' 。 – DyZ
@DYZああ、ありがとう。有効なパラメータのリストまたはそれがわからないことを示すメッセージがある場合のみ! – RogueCSDev
答えはありませんが、https://github.com/tpoechtrager/wclangが見つかりました。まだ試していません。 "Linux/Unix上でclangを使って簡単にソースコードをクロスコンパイルする" –