Компиляция 32-битной программы C ++ с CygWin на Win10 и CLion не будет работать ни с одним компилятором - PullRequest
0 голосов
/ 14 ноября 2018

Я знаю, что это очень часто задаваемый вопрос, и я действительно уже просмотрел все ответы, но не смог найти свою проблему и решение для нее.

Предисловие

Использование Cygwin Toolchain в CLion для создания 64-битной программы на C ++ работало как шарм.Никаких ошибок или чего бы то ни было.Затем я попытался сделать то же самое для 32-битной версии и быстро понял, что это гораздо сложнее понять.

CMakeList

Здесь я добавил флаг -m32 к ужеработающий CMakeLists.txt

# cmake_minimum_required(VERSION <specify CMake version here>)
project(my_program)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_FLAGS -m32)

add_library(my_program SHARED library.cpp)

Затем я использовал CygWin для загрузки множества компиляторов c ++, просто чтобы убедиться, что у меня есть хотя бы один из них, который может работать.

Вот способ, которым я настраиваюэто для 32-битной сборки

enter image description here

После этого CMake перестраивает файлы сборки, а затем я начал компилировать проект.

Появляются следующие сообщения об ошибках (усеченные, потому что все они на самом деле одинаковы, но с разными «отсутствующими» библиотеками, которые не могут быть найдены)

C:\Users\xetra11\.CLion2018.2\system\cygwin_cmake\bin\cmake.exe --build /cygdrive/c/Development/Github/CoopR-HQ-Extension/cmake-build-default --target all -- -j 10
[ 50%] Linking CXX shared library cygCoopR_HQ_Extension.dll
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc

Используются компиляторы C ++ Это компиляторыЯ пытался использовать.Все они приводят к небольшим различным сообщениям об ошибках, но все объединены в разглагольствование для того, чтобы не найти библиотеку

Cygwin compilers :

  • C: \ cygwin64 \ bin \x86_64-pc-cygwin-gcc.exe ( тот, который использовался в этом вопросе )
  • C: \ cygwin64 \ bin \ x86_64-pc-cygwin-gcc-7.3.0.exe
  • C: \ cygwin64 \ bin \ x86_64-pc-cygwin-g ++. Exe
  • C: \ cygwin64 \ bin \ x86_64-pc-cygwin-c ++. Exe
  • C: \ cygwin64 \ bin \ i686-pc-cygwin-c ++. exe ( неработающий CMake сгенерировал ошибки: ссылка )
  • C: \ cygwin64 \ bin \ i686-pc-cygwin-cpp.exe ( не работает CMake сгенерировал ошибки: ссылка )
  • C: \ cygwin64 \ bin \ i686-pc-cygwin-g ++. exe ( ошибка произошла: ссылка )
  • C: \ cygwin64 \ bin \ i686-pc-cygwin-gcc-6.4.0.exe ( повреждено Ошибки броска CMake: ссылка )
  • C: \ cygwin64 \ bin \ i686-pc-cygwin-gcc.exe ( сломано Ошибки броска CMake: ссылка )

MinGW компиляторы :

  • C: \ cygwin64 \ bin \ x86_64-w64-mingw32-c ++. Exe
  • C: \ cygwin64 \ bin \ x86_64-w64-mingw32-cpp.exe( неработающий CMake сгенерировал ошибки: ссылка )
  • C: \ cygwin64 \ bin \ x86_64-w64-mingw32-g ++. Exe
  • C:\ cygwin64 \ bin \ x86_64-w64-mingw32-gcc-6.4.0.exe
  • C: \ cygwin64 \ bin \ x86_64-w64-mingw32-gcc.exe
  • C: \ cygwin64\ bin \ i686-w64-mingw32-c ++. exe ( без ошибок )

Последний не выдал никаких ошибок, но при проверке .DLL с DependencyУокер Я обнаружил, что все связанные .DLLs к этому все еще полагаются на x64, и поэтому Error: Modules with different CPU types were found.

enter image description here

Я немного устали действительно был бы признателен за некоторые советы, как правильно построить этот материал.Я уже думаю, что понял тот факт, что мне нужно ввести 32-битные библиотеки.Но я не знаю, как и почему.Я предположил, что у цепочки инструментов есть это из коробки.

Пожалуйста, имейте в виду, что я довольно не привык к C ++ на окнах.

1 Ответ

0 голосов
/ 14 ноября 2018

Сначала вам нужно определить, хотите ли вы собрать программу для Windows или Cygwin. Они не такие, как любая программа cygwin, зависит от cygwin1.dll его собственной архитектуры.

В 64-битной системе x86_64-pc-cygwin-gcc.exe совпадает с gcc.exe и аналогично x86_64-pc-cygwin-gcc-7.3.0.exe.
https://cygwin.com/packages/x86_64/gcc-core/gcc-core-7.3.0-3
Все они создают 64-битную программу Cygwin.

Простой способ создания 32-битной программы cygwin - это установить 32-битную версию cygwin и работать над этим. Cygwin 32bit и 64bit могут быть установлены параллельно и не мешать друг другу.

Альтернативное решение, не рекомендуемое, заключается в использовании кросс-компилятора от 64 до 32 бит: cygwin32-gcc-core и связанного с ним binutils
https://cygwin.com/packages/x86_64/cygwin32-gcc-core/cygwin32-gcc-core-7.3.0-1 https://cygwin.com/packages/x86_64/cygwin32-binutils/cygwin32-binutils-2.29-1

Если вы пытаетесь собрать программу для Windows, вам нужно использовать кросс-компилятор из Cygwin 64 bit в Windows. Для 64-битной цели вам понадобятся: mingw64-x86_64-gcc-core и mingw64-x86_64-binutils https://cygwin.com/packages/x86_64/mingw64-x86_64-gcc-core/mingw64-x86_64-gcc-core-7.3.0-1 https://cygwin.com/packages/x86_64/mingw64-x86_64-binutils/mingw64-x86_64-binutils-2.31.1.be46fa23-1

Для 32-битной цели вам понадобятся: mingw64-i686-gcc-core и mingw64-i686-binutils https://cygwin.com/packages/x86_64/mingw64-i686-gcc-core/mingw64-i686-gcc-core-7.3.0-1 https://cygwin.com/packages/x86_64/mingw64-i686-binutils/mingw64-i686-binutils-2.31.1.be46fa23-1

Ни один компилятор на Cygwin не создан с возможностью двойной архитектуры.

...