2017-02-05 19 views
6

Я пытаюсь перекрестно скомпилировать приложения C из Linux (64 бит) в Windows (64 бит) с помощью Clang. Я прочитал page on cross-compilation, что было не слишком полезно.Перекрестная компиляция из Linux в Windows с помощью Clang

В качестве простого теста, у меня есть следующий код в test.c:

#include <stdio.h> 

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

Моя догадка до сих пор clang -o test -target x86_64-win64-?ABI? test.c. Однако я понятия не имею, что использует ABI Windows 64 бит. Когда я запускаю clang с целевой тройкой x86_64-win64-abcdefg, он, похоже, компилируется отлично - то есть он заканчивается без ошибок и приводит к чему-то, что является несколько действительным двоичным кодом. Это не имеет никакого смысла, учитывая, что 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 где-то, так как он утверждает, что способен перекрестно компилировать; но где? Если этого не произойдет, есть ли где-нибудь я могу их скачать?

Есть ли список всех архитектур, систем и поддерживающих ABA Clang? Список на странице кросс-компиляции не является исчерпывающим.

На странице также предлагается использовать -mcpu=..., но предупреждение указывает на то, что оно устарело. Вместо этого, как рекомендует предупреждение, я попробовал -mtune=x86_64. Это, кажется, не имеет никакого эффекта. Это даже необходимо, учитывая, что архитектура указана в целевой тройке?

Я видел литературу, которая предлагает мне lld, экспериментальный линкер LLVM. Это так? У меня возникли проблемы с компиляцией lld и хотелось бы избежать этого, если это возможно.

+1

«Если вы выберете параметр, который Clang не знает, например, blerg, он будет игнорировать и предположить неизвестное, что не всегда желательно, поэтому будьте осторожны.» «И это, вероятно, произошло, когда вы выбрали' abcdefg' , – DyZ

+0

@ DYZ ах ладно, спасибо. Если только был список допустимых параметров или какое-то сообщение, чтобы указать, что он не знает! – RogueCSDev

+0

не ответ, но я нашел https://github.com/tpoechtrager/wclang - еще не пробовал. «Кросс-компиляция исходного кода легко для Windows с clang на Linux/Unix» –

ответ

1

Я установил mobaxterm на моем компьютере с окнами 10. Существует бесплатная версия. Он предоставляет xserver. Он содержит установку cygwin, и вы можете запустить локальный терминал. вы просто набираете: apt-get install clang и clang готов к компиляции и находит stdio.h без жалобы.

Но если вы намерены запустить полученный исполняемый файл не на mobaxterm/cygwin, а внутри самих окон, вам нужно скомпилировать вместо него mingwin.