LINUX.ORG.RU

Собрать консольную программку на C++ для Windows в Gentoo

 ,


0

1

Добрый день! Руководствуясь этим: https://wiki.gentoo.org/wiki/Mingw установил кросс-компилятор. Программы собираются нормально

$ cat hello.cpp 
#include <iostream>
using namespace std;

int main() {
        cout << "Hello, World" << endl;
        return 0;


$ i686-w64-mingw32-g++ hello.cpp -o hello.exe -mconsole -static-libgcc -static-libstdc++

Версия gcc: 7.2.0 Но при попытке запустить в wine или в Windows в консольном окошке cmd.exe ничего не получаю. В чём проблема?

Ответ на: комментарий от xDShot

При запуске в wine:

err:module:import_dll Library libwinpthread-1.dll (which is needed by L"Z:\\home\\xdshot\\mingw.exe") not found

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

Вангую не хватает gcc библиотек для винды.

Опции -static-libgcc -static-libstdc++ позволяют скомпилировать эти библиотеки статически.

Rubystar ★★
() автор топика
Ответ на: комментарий от xDShot

Тогда надо тот libwinpthread-1.dll как-то статически вкомпилить.

$ wine hello.exe
$

У меня такое ни на что не ругается, просто не делает ничего. Возможно проблема в версии gcc-7.2.0? Нужно бы проверить с gcc6, такое ли будет поведение.

Rubystar ★★
() автор топика
Последнее исправление: Rubystar (всего исправлений: 1)
Ответ на: комментарий от Radjah

Не работает на Gentoo, хоть ты тресни. Вот вывод компиляции:

$ i686-w64-mingw32-g++ -v hello.cpp -o hello.exe -static-libgcc -static-libstdc++ 
Используются внутренние спецификации.
COLLECT_GCC=/usr/x86_64-pc-linux-gnu/i686-w64-mingw32/gcc-bin/7.2.0/i686-w64-mingw32-g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-w64-mingw32/7.2.0/lto-wrapper
Целевая архитектура: i686-w64-mingw32
Параметры конфигурации: /var/tmp/portage/cross-i686-w64-mingw32/gcc-7.2.0-r1/work/gcc-7.2.0/configure --host=x86_64-pc-linux-gnu --target=i686-w64-mingw32 --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/i686-w64-mingw32/gcc-bin/7.2.0 --includedir=/usr/lib/gcc/i686-w64-mingw32/7.2.0/include --datadir=/usr/share/gcc-data/i686-w64-mingw32/7.2.0 --mandir=/usr/share/gcc-data/i686-w64-mingw32/7.2.0/man --infodir=/usr/share/gcc-data/i686-w64-mingw32/7.2.0/info --with-gxx-include-dir=/usr/lib/gcc/i686-w64-mingw32/7.2.0/include/g++-v7 --with-python-dir=/share/gcc-data/i686-w64-mingw32/7.2.0/python --enable-languages=c,c++ --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 7.2.0-r1 p1.1' --disable-esp --enable-libstdcxx-time --enable-poison-system-directories --with-sysroot=/usr/i686-w64-mingw32 --disable-bootstrap --disable-multilib --disable-altivec --disable-fixed-point --with-arch=i686 --enable-targets=all --disable-libgcj --enable-libgomp --disable-libmudflap --disable-libssp --disable-libcilkrts --disable-libmpx --disable-vtable-verify --disable-libvtv --disable-libquadmath --enable-lto --without-isl --disable-libsanitizer --enable-default-pie --enable-default-ssp
Модель многопоточности: win32
gcc версия 7.2.0 (Gentoo 7.2.0-r1 p1.1) 
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.exe' '-static-libgcc' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-w64-mingw32/7.2.0/cc1plus -quiet -v -U_REENTRANT hello.cpp -quiet -dumpbase hello.cpp -mtune=generic -march=i686 -auxbase hello -version -o /tmp/ccskwYuS.s
GNU C++14 (Gentoo 7.2.0-r1 p1.1) версия 7.2.0 (i686-w64-mingw32)
        скомпилировано GNU C версия 7.2.0, GMP version 6.1.0, MPFR version 3.1.3-p4, MPC version 1.0.2, isl version none
эвристики GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
несуществующий каталог "/usr/i686-w64-mingw32/usr/local/include" проигнорирован
несуществующий каталог "/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/include" проигнорирован
порядок поиска для #include "...":
порядок поиска для #include <...>:
 /usr/lib/gcc/i686-w64-mingw32/7.2.0/include/g++-v7
 /usr/lib/gcc/i686-w64-mingw32/7.2.0/include/g++-v7/i686-w64-mingw32
 /usr/lib/gcc/i686-w64-mingw32/7.2.0/include/g++-v7/backward
 /usr/lib/gcc/i686-w64-mingw32/7.2.0/include
 /usr/lib/gcc/i686-w64-mingw32/7.2.0/include-fixed
 /usr/i686-w64-mingw32/mingw/include
Конец списка поиска.
GNU C++14 (Gentoo 7.2.0-r1 p1.1) версия 7.2.0 (i686-w64-mingw32)
        скомпилировано GNU C версия 7.2.0, GMP version 6.1.0, MPFR version 3.1.3-p4, MPC version 1.0.2, isl version none
эвристики GGC: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 9748d1b48bfe958769cd1383c236d9fd
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.exe' '-static-libgcc' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-w64-mingw32/as -v -o /tmp/ccGlMOSl.o /tmp/ccskwYuS.s
GNU ассемблер, версия 2.29.1 (i686-w64-mingw32); используется BFD версии (Gentoo 2.29.1 p3) 2.29.1
COMPILER_PATH=/usr/libexec/gcc/i686-w64-mingw32/7.2.0/:/usr/libexec/gcc/i686-w64-mingw32/7.2.0/:/usr/libexec/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/7.2.0/:/usr/lib/gcc/i686-w64-mingw32/:/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/bin/
LIBRARY_PATH=/usr/lib/gcc/i686-w64-mingw32/7.2.0/:/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib/../lib/:/usr/i686-w64-mingw32/mingw/lib/../lib/:/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib/:/usr/i686-w64-mingw32/mingw/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.exe' '-static-libgcc' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-w64-mingw32/7.2.0/collect2 -plugin /usr/libexec/gcc/i686-w64-mingw32/7.2.0/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/i686-w64-mingw32/7.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccQU3akP.res -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt -plugin-opt=-pass-through=-ladvapi32 -plugin-opt=-pass-through=-lshell32 -plugin-opt=-pass-through=-luser32 -plugin-opt=-pass-through=-lkernel32 -plugin-opt=-pass-through=-lmingw32 -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_eh -plugin-opt=-pass-through=-lmoldname -plugin-opt=-pass-through=-lmingwex -plugin-opt=-pass-through=-lmsvcrt --sysroot=/usr/i686-w64-mingw32 -m i386pe -Bdynamic -pie -o hello.exe /usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib/../lib/crt2.o /usr/lib/gcc/i686-w64-mingw32/7.2.0/crtbegin.o -L/usr/lib/gcc/i686-w64-mingw32/7.2.0 -L/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib/../lib -L/usr/i686-w64-mingw32/mingw/lib/../lib -L/usr/lib/gcc/i686-w64-mingw32/7.2.0/../../../../i686-w64-mingw32/lib -L/usr/i686-w64-mingw32/mingw/lib /tmp/ccGlMOSl.o -Bstatic -lstdc++ -Bdynamic -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc -lgcc_eh -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/i686-w64-mingw32/7.2.0/crtend.o
COLLECT_GCC_OPTIONS='-v' '-o' 'hello.exe' '-static-libgcc' '-mtune=generic' '-march=i686'

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

Пока ты отвечал, я на своей машине собрал.

$ x86_64-w64-mingw32-g++ -dumpversion
7.2.0
Программа компилится, но в консоль пишет ничего. Похоже, что бага. Можно попробовать собрать более старую версию. Если есть время и желание, попробуй сравни с пакетами из дебиана, там же работает как ни странно.

Radjah ★★★★★
()

Если цель не разобраться именно с Mingw в Gentoo, а просто собрать программки для Windows в Gentoo, то попробуй вместо Gentoo Mingw это: http://mxe.cc/

fsb4000 ★★★★★
()

Регулярно собираю у себя MinGW и кросскомпиляцией и на винде.

Баги там есть такие:

1) если multilib, то в bin кладется i686 версия stdc++, смотри там через objdump, не это ли произошло. Проверь другие либы gcc на эту же ошибку.

2) gomp и еще некоторая байда не работает. иногда даже не собирается

3) попробуй пересобрать mingw-w64-runtime без оптимизации (-O0), иногда там что-то падает

4) динамические либы gcc лучше вообще не используй, они перманентно с какой-то сраниной, да и самому таскать же меньше с собой. Ты все-равно вряд ли собираешься держать ворох динамических C++ библиотек (а если собираешься, у меня для тебя плохие новости, касательно стабильности abi и мэнглинга)

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

А, и еще вижу, ты зачем-то используешь 32-битный компилятор, на какой хрен он тебе сдался не пойму, где еще осталась 32-битная винда. Вобщем, тогда все так же, но для первого пункта проверь обратное. Программа пытается подцепить libstdc++ не той бинарности.

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

Помогла опция -no-pie при компиляции программы кросс-компилятором.

Rubystar ★★
() автор топика
Ответ на: комментарий от sf

:) Ура, ты нашёл баг, который я запостил.

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