代码之家  ›  专栏  ›  技术社区  ›  xetra11

用CygWin编译一个32位C++程序,在Wi10&COLY上不适用于任何编译器

  •  0
  • xetra11  · 技术社区  · 6 年前

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

    序言

    使用克利永中的CygWin工具链来构建一个类似于魅力的64位C++程序。没有任何错误。然后我试着对32位做同样的事情,很快意识到这很难理解。

    卡马克主义者

    在这里我添加了 -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引发错误: 链接 )
    • C:\ cygwin64\bin\i686-pc-cygwin-g++.exe( 错误 发生: link )
    • 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时 依赖关系行者 我发现所有与此相关的.dll仍然依赖于x64,因此 Error: Modules with different CPU types were found.

    enter image description here

    我现在有点累了,我真的很感激一些提示,如何让这些东西建立正确的方式。我想我已经明白了我必须带32位的库。但我真的不知道为什么。我以为工具链已经开箱即用了。

    请注意,我对Windows上的C++是相当不习惯的。

    1 回复  |  直到 6 年前
        1
  •  0
  •   matzeri    6 年前

    似乎首先需要定义是要构建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 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上没有使用双体系结构功能构建编译器。