LINUX.ORG.RU

Как кросскомпилировать программы С++?


1

2

Понимаешь ЛОРчик есть одни хелловорды и их надо собрать под Ubuntu 32-bit и 64-bit, также под Win32. Вопрос а как в 64-x битной Ubuntu собрать 32-х битное приложение? Под Win32 можно собрать используя i686-w64-mingw32-g++. Т.е. введя i686-w64-mingw32-g++ firts.cpp -o first.exe получу exe-шник. А как получить 32-х битного эльфа на 64-х битной Ubuntu?

И ещё пару вопросов?

1. Чем отличается wineg++ от i686-w64-mingw32-g++?

2. Вообще, с помощью wineg++ можно получить exe-шник?

3. Как вообще собирают Wine и ReactOS.

4. Чем отличается wine1.3-dev http://packages.ubuntu.com/precise/amd64/wine1.3-dev/filelist от mingw-w64-dev http://packages.ubuntu.com/precise/all/mingw-w64-dev/filelist. Почему mingw-w64-dev больше по размеру wine1.3-dev? И почему wine1.3-dev медленно, но верно растёт по объёму? Ведь это же всего лишь h-едеры.

5. Теперь в Debian общий вид gcc компилятора имеет вид: arch-os-gxx. Например, http://packages.debian.org/sid/ia64/g++/filelist есть i64-linux-gnu-g++ т.е. архитектура i64, ос linux-gnu, компилятор g++, или http://packages.debian.org/wheezy/kfreebsd-amd64/gcc/filelist есть файлик x86_64-kfreebsd-gnu-gcc т.е. архитектура x86_64, ос kfreebsd-gnu, компилятор gcc или вот ещё http://packages.debian.org/sid/hurd-i386/gfortran/filelist есть файлик i486-gnu-gfortran т.е. архитектура i486, ос gnu, компилятор gfortran.
Т.е. http://packages.debian.org/sid/amd64/gcc-mingw-w64/filelist есть i686-w64-mingw32-g++. Т.е. архитектура i686, ос w64-mingw32, компилятор g++. i686-w64-mingw32-g++ будет компилировать с C++ даст бинарник оптимизированный под Pentium Pro (i686) и бинарник будет под Windows/Wine/ReactOS. Мои рассуждения верны?

6, В Wine есть 16-ти битной код для запуска Win16 приложений. Чем и как его собирают? Кроме Wine есть ли другие программы под Linux работающие в 16-ти битном режиме, т.е. i286 (защищённый режим работы CPU, с 16-ти разрядными регистрами, сегментной моделью памяти) В Windows есть NTVDM, а в Wine — WINEVDM. В каталоге C:\windows\system32 есть файл winevdm.exe Как собирают winevdm.exe?

Примеры:

# include <iostream>
# include <limits>
int main () {
  int last_digit; 
  int int_number, first_digit, chastnoe, chastnoe2;	
  int a;
  int flag;
  int temp_number2, temp_number,temp_number_max_int;
  int max_int; 
  int last_digit_max_int;
  max_int = std::numeric_limits<int>::max();
  temp_number_max_int = chastnoe2 = max_int;
  flag=0;
  a=10;
  std::cin >> int_number;
  if (int_number < 10 )  {std::cout << "Число должно быть больше 10\n"; goto endprg;}
  chastnoe=temp_number = int_number;
  first_digit = int_number % 10;
  while (chastnoe >=10) {
    last_digit = chastnoe %10;
    temp_number2 = chastnoe %100;
    temp_number2 = temp_number2 / 10;
    last_digit_max_int = chastnoe2 % 10; 
    if (temp_number2 == last_digit) flag++;  
    chastnoe = temp_number / a;
    chastnoe2 = temp_number_max_int / a;
    if (chastnoe<10) break;
    a = a *10;
  }
  if (flag == 0) std::cout << "No\n"; else std::cout << "Yes\n";
  if (first_digit>chastnoe2) std::cout << "Overflow\n"; else {
    std::cout << first_digit*a + 10*((int_number % a)/10) +chastnoe << "\n";
  }
  endprg:return 0;
}

При сборке

alexey@alexey-laptop:~/prg$ i686-w64-mingw32-g++ test.cpp -o test.exe
alexey@alexey-laptop:~/prg$ x86_64-linux-gnu-g++ test.cpp -o test
alexey@alexey-laptop:~/prg$ wineg++ test.cpp -o test1 /usr/bin/ld: Relocatable linking with relocations from format elf32-i386 (test-c0vYza.o) to format elf64-x86-64 (test1.kLZdHP.o) is not supported
winebuild: /usr/bin/ld failed with status 1
winegcc: winebuild failed

alexey@alexey-laptop:~/prg$ file test.exe
test.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit
alexey@alexey-laptop:~/prg$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
alexey@alexey-laptop:~$ file test1
test1: ERROR: cannot open `test1' (No such file or directory)
alexey@alexey-laptop:~$

Почему wineg++ ничего не собирает?

Или же:


#include <stdio.h>
#include <windows.h>
 
int main ()
{
        SYSTEMTIME lpSystemTime;
 
        GetSystemTime(&lpSystemTime);
        printf("Today is: %d/%d/%d\n", lpSystemTime.wYear,
                        lpSystemTime.wMonth, lpSystemTime.wDay);
        return 0;
}

Собираем: alexey@alexey-laptop:~/prg$ x86_64-linux-gnu-g++ second.cpp -o second
second.cpp:2:21: фатальная ошибка: windows.h: Нет такого файла или каталога
компиляция прервана.
alexey@alexey-laptop:~/prg$ i686-w64-mingw32-g++ second.cpp -o second.exe
alexey@alexey-laptop:~/prg$ wineg++ second.cpp -o second

И здесь куча ошибок такого плана http://pastebin.com/46fwpmKS

alexey@alexey-laptop:~/prg$ file second.exe
second.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit
alexey@alexey-laptop:~$ file second
second: ERROR: cannot open `second' (No such file or directory)
alexey@alexey-laptop:~/prg$ ./second.exe
Today is: 2011/11/5
alexey@alexey-laptop:~/prg$

Для чего вообще нужен этот wineg++?

man wineg++ даёт: winegcc - Wine C and C++ MinGW Compatible Compiler

Так почему это C++ MinGW Compatible Compiler ничего не собирает?

★★★★★

>Как вообще собирают Wine и ReactOS.
А чем их сборка ReactOS отличается от сборки, скажем, генты (лфс) или офтопика? Под какой ОС это совсем другой вопрос(сам задавался этим вопросом)).

Как вообще собирают Wine

Как обычную программу. Чем по вашему отличается сборка вайна от, скажем, либры??

Как собирают winevdm.exe?

Смотри выше. Я так думаю, что winevdm что то вроде прослойки для запуска 16 битных программ. В случае сегментной памяти, наверное, ее модель просто имулируеться, ведь невозможно переключить проц в другой режим без перезагрузки.

5. . Т.е. архитектура i686, ос w64-mingw32, компилятор g++. i686-w64-mingw32-g++ будет компилировать с C++ даст бинарник оптимизированный под Pentium Pro (i686) и бинарник будет под Windows/Wine/ReactOS. Мои рассуждения верны?

бинарник оптимизированный под Pentium Pro (i686


Скорее всего нет. Нужно в Makefile править cflags cxxflags чтоб оптимизировать, а i686 - это под какой проц оптимизированый компилятор. Можете оптимизировать хоть под i7 если компилятор позволяет.
6. А int main(){return 0;} скомпилирует?? Если да, попробуй хелловорд.

Если где-то ошибся, поправте.

ymuv ★★★★
()

Под Win32 можно собрать используя i686-w64-mingw32-g++

А можно использовать msvs cl под вайном. Работает, проверял :)

vasily_pupkin ★★★★★
()
Ответ на: комментарий от ymuv

А чем их сборка ReactOS отличается от сборки, скажем, генты (лфс) или офтопика?

Ну так ReactOS собирают под Linux (хотя и под Windows тоже можно собрать) и не Microsoft Visual Studio, а gcc. Windows собирают в Windows, а Linux в Linux. ReactOS совершенно не похожа на Linux.

Под какой ОС это совсем другой вопрос(сам задавался этим вопросом)).

Под nix http://www.reactos.org/wiki/ReactOS_Build_Environment

Как обычную программу. Чем по вашему отличается сборка вайна от, скажем, либры??

А что в либре для Linux есть PE exe-шники типа ipconfig.exe?

Скорее всего нет. Нужно в Makefile править cflags cxxflags чтоб оптимизировать, а i686 - это под какой проц оптимизированый компилятор. Можете оптимизировать хоть под i7 если компилятор позволяет.

А почему x86_64-w64-mingw32-g++ выдаёт бинарь под Win64?

int main(){return 0;}

alexey@alexey-laptop:~/prg$ wineg++ test2.cpp -o test2
/usr/bin/ld: Relocatable linking with relocations from format elf32-i386 (test2-f4doQ7.o) to format elf64-x86-64 (test2.o5jhHp.o) is not supported
winebuild: /usr/bin/ld failed with status 1
winegcc: winebuild failed
alexey@alexey-laptop:~/prg$

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от DELIRIUM

Спасибки

> Флаг -m32 у gcc.

Спасибо. Нужный ключ. Теперь вот что имеем:

alexey@alexey-laptop:~/prg$ x86_64-linux-gnu-g++ test.cpp -o test
alexey@alexey-laptop:~/prg$ x86_64-linux-gnu-g++ -m32 test.cpp -o test32
alexey@alexey-laptop:~/prg$ wineg++ -m32 test.cpp -o test32
alexey@alexey-laptop:~/prg$ i686-w64-mingw32-g++ test.cpp -o test32.exe
alexey@alexey-laptop:~/prg$ x86_64-w64-mingw32-g++ test.cpp -o test.exe

Получаем 5 файликов:

alexey@alexey-laptop:~/prg$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
alexey@alexey-laptop:~/prg$ file test32
test32: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped
alexey@alexey-laptop:~/prg$ file test32.exe.so
test32.exe.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
alexey@alexey-laptop:~/prg$ file test32.exe
test32.exe: PE32 executable for MS Windows (console) Intel 80386 32-bit
alexey@alexey-laptop:~/prg$ file test.exe
test.exe: PE32+ executable for MS Windows (console) Mono/.Net assembly
alexey@alexey-laptop:~/prg$

Что за файл образовался test.exe.so? Как понять exe.so. Это такой специальный exe-шник для Linux работающий через Wine?

Root-msk ★★★★★
() автор топика
Ответ на: комментарий от Root-msk

> > msvs cl

RMS-угодно же.

RMS-неугодно же.

fxd.

Root-msk ★★★★★
() автор топика

Для чего вообще нужен этот wineg++?

Иногда полезно прочитать ман:

winegcc is a gcc wrapper which tries to provide a MinGW compatible compiler under Linux. This is most useful to Win32 developers who can simply take their MinGW code from Windows, and recompile it without modifications under Winelib on Linux. wineg++ accepts mostly the same options as winegcc.

Оно нужно, чтобы портировать Windows программы на Linux. К кросс-компиляции оно не имеет никакого отношения (собирается «родное» Linux приложение).

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.