我知道这是一个非常常见的问题,我确实已经浏览了所有答案,但是我也找不到我的问题和解决方案。
在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编译器:
MinGW编译器:
最后一个并没有引发任何错误,但是当使用 Dependency Walker 检查.DLL时,我发现与此相关的所有链接.DLL仍然依赖于x64,因此Error: Modules with different CPU types were found.
>
我现在有点累了,真的很高兴能获得一些提示,使您以正确的方式构建这些东西。我已经认为我了解必须引入32位库这一事实。但是我真的不知道如何以及为什么。我认为工具链是开箱即用的。
请注意,我对Windows上的C ++相当陌生。
答案 0 :(得分:0)
首先,您需要定义是要构建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程序的简单方法是安装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上没有编译器具有双重体系结构功能。