在Win10和CLion上使用CygWin编译32位C ++程序不适用于任何编译器

时间:2018-11-14 11:25:20

标签: c++ windows-10 cygwin clion 32-bit

我知道这是一个非常常见的问题,我确实已经浏览了所有答案,但是我也找不到我的问题和解决方案。

前言

在CLion中使用Cygwin工具链来构建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编译器

  • 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抛出错误:link
  • C:\ cygwin64 \ bin \ i686-pc-cygwin-cpp.exe(已损坏 CMake引发错误:link
  • C:\ cygwin64 \ bin \ i686-pc-cygwin-g ++。exe(发生错误link
  • C:\ cygwin64 \ bin \ i686-pc-cygwin-gcc-6.4.0.exe(损坏 CMake抛出错误:link
  • C:\ cygwin64 \ bin \ i686-pc-cygwin-gcc.exe(损坏 CMake抛出错误:link

MinGW编译器

  • C:\ cygwin64 \ bin \ x86_64-w64-mingw32-c ++。exe
  • C:\ cygwin64 \ bin \ x86_64-w64-mingw32-cpp.exe(损坏 CMake引发错误:link
  • 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(没有错误

最后一个并没有引发任何错误,但是当使用 Dependency Walker 检查.DLL时,我发现与此相关的所有链接.DLL仍然依赖于x64,因此Error: Modules with different CPU types were found.

enter image description here

我现在有点累了,真的很高兴能获得一些提示,使您以正确的方式构建这些东西。我已经认为我了解必须引入32位库这一事实。但是我真的不知道如何以及为什么。我认为工具链是开箱即用的。

请注意,我对Windows上的C ++相当陌生。

1 个答案:

答案 0 :(得分:0)

首先,您需要定义是要构建Windows程序还是Cygwin程序。它们与任何cygwin程序都不相同,取决​​于他自己的体系结构中的cygwin1.dll。

在64位系统上,x86_64-pc-cygwin-gcc.exegcc.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程序的简单方法是安装cygwin的32位版本并进行处理。 Cygwin 32位和64位可以并行安装,并且不会互相干扰。

不推荐的替代解决方案是使用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位到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上没有编译器具有双重体系结构功能。