【问题标题】:Compiling a 32bit C++ program with CygWin on Win10 & CLion won't work with any compiler在 Win10 和 CLion 上使用 CygWin 编译 32 位 C++ 程序不适用于任何编译器
【发布时间】:2018-11-14 11:25:19
【问题描述】:

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

前言

使用 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 位构建配置它的方式

这样做之后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(broken CMake 抛出错误:link
  • C:\cygwin64\bin\i686-pc-cygwin-cpp.exe(broken CMake 抛出错误:link
  • C:\cygwin64\bin\i686-pc-cygwin-g++.exe(错误发生:link
  • C:\cygwin64\bin\i686-pc-cygwin-gcc-6.4.0.exe(broken CMake 抛出错误:link
  • C:\cygwin64\bin\i686-pc-cygwin-gcc.exe(broken CMake 抛出错误:link

MinGW 编译器

  • C:\cygwin64\bin\x86_64-w64-mingw32-c++.exe
  • C:\cygwin64\bin\x86_64-w64-mingw32-cpp.exe(broken 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.

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

请注意,我不太习惯在 Windows 上使用 C++。

【问题讨论】:

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


    【解决方案1】:

    似乎首先需要定义是要构建 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 程序的简单方法是安装 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 位到 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 上没有编译器具有双重架构能力。

    【讨论】:

    • 等等,你是指来自cygwin.com/install.htmlsetup-x86.exe 吗?因为我认为它只是 32 位 Windows 版本的安装程序 GUI 的可执行文件?还是有编译32位程序的工具链??
    • setup-x86.exe 安装 Cygwin 32 位,setup-x86_64.exe 安装 cygwin 64 位。这两个系统提供几乎所有相同的包
    • 好吧,对我来说,问题是我看到很多包,我就是不知道我需要什么。您提到简单的方法是安装32位的cygwin。你能告诉我那到底是什么吗?您是指特定的编译器还是 .dll,在包管理器中查找的完整限定名称是什么?
    • 为什么需要在 64 位 Cygwin 上构建 32 位程序?
    • Cygwin 是 Posix 环境,它充当 Windows 之上的伪操作系统。 Cygwin 程序与 Windows 程序不同,需要cygwin1.dll 作为其行为的基础。有两种口味,一种用于 32 位,一种用于 64 位。 64 位的 Windows 可以同时运行。仅 32 位的 Windows 32 位的 Cygwin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 2020-11-25
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    相关资源
    最近更新 更多