“您选择的CPU不支持x86-64指令集”错误在Cygwin-x64上

时间:2013-12-27 13:58:05

标签: windows gcc openssl makefile cygwin

我正在尝试按照以下说明在cygwin中安装openssl: 我从这个网站http://www.openssl.org/source/下载了最新的tarball,并把它放在C:\ cygwin64 \ home中,然后我从cygwin运行这些命令

  1. tar zxvf openssl-1.0.1e.tar.gz
  2. cd openssl-1.0.1e
  3. ./配置
  4. 使
  5. make test
  6. make install

    (来自此处的说明:http://www.slideshare.net/ganaaturuu/cygwinandopen-sslinstallguide

  7. 直到第3步./config它运行正常我相信,至少没有报告错误,它给出了消息“为Cygwin配置”。到底。当我运行make虽然它给了我这个输出:

    making all in crypto...
    make[1]: Entering directory '/home/openssl-1.0.1e/crypto'
    ( echo "#ifndef MK1MF_BUILD"; \
    echo '  /* auto-generated by crypto/Makefile for crypto/cversion.c */'; \
    echo '  #define CFLAGS "gcc -DOPENSSL_THREADS  -DDSO_DLFCN -DHAVE_DLFCN_H -DTERM                                                                                                                IOS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_                                                                                                                WORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM                                                                                                                 -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLP                                                                                                                OOL_ASM -DGHASH_ASM"'; \
    echo '  #define PLATFORM "Cygwin"'; \
    echo "  #define DATE \"`LC_ALL=C LC_TIME=C date`\""; \
    echo '#endif' ) >buildinf.h
    gcc -I. -I.. -I../include  -DOPENSSL_THREADS  -DDSO_DLFCN -DHAVE_DLFCN_H -DTERMI                                                                                                                OS -DL_ENDIAN -fomit-frame-pointer -O3 -march=i486 -Wall -DOPENSSL_BN_ASM_PART_W                                                                                                                ORDS -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM                                                                                                                 -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DRMD160_ASM -DAES_ASM -DVPAES_ASM -DWHIRLPO                                                                                                                OL_ASM -DGHASH_ASM   -c -o cryptlib.o cryptlib.c
    cryptlib.c:1:0: error: CPU you selected does not support x86-64 instruction set
     /* crypto/cryptlib.c */
     ^
    cryptlib.c:1:0: error: CPU you selected does not support x86-64 instruction set
    <builtin>: recipe for target 'cryptlib.o' failed
    make[1]: *** [cryptlib.o] Error 1
    make[1]: Leaving directory '/home/openssl-1.0.1e/crypto'
    Makefile:278: recipe for target 'build_crypto' failed
    make: *** [build_crypto] Error 1
    

    我搜索了“您选择的CPU不支持x86-64指令集”,我认为它与CFLAGS和-march = i486选项有关,但我完全不确定它应该是什么改变。

    在这个How to compile a C++ program as 64-bit on 64-bit machine?问题中提出了一些解决方案,但在我的情况下,makefile选项中没有任何地方可以删除-m32和-march = i686。

    如果你能告诉我正确的搜索方向,如果不是解决方案,我将不胜感激。

    我正在使用64位Windows 7,使用cygwin和gcc版本4.8.2。

3 个答案:

答案 0 :(得分:3)

这里也是&#34;我也是&#34;回答是因为事情发生了一些变化。 Cygwin-x64支持于2015年5月在Issue 3110: Adding support for x86_64 Cygwin下获得支持。

但是, config 仍会选择要构建的库的i686版本。另请参阅OpenSSL错误跟踪器中的Issue #4326: Failed to configure for Cygwin-x64

要在Cygwin-x64上构建OpenSSL 1.0.2,您必须使用 Configure 并选择三元组。下面是汤到坚果的食谱。

$ curl https://www.openssl.org/source/openssl-1.0.2f.tar.gz -o openssl-1.0.2f.tar.gz
...
$ tar -xzf openssl-1.0.2f.tar.gz
...
$ cd openssl-1.0.2f

然后:

$ ./Configure Cygwin-x86_64 shared no-ssl2 no-ssl3 --openssldir="$HOME/ssl"
...
$ make depend
...
$ make
...
$ make install_sw

install_sw$OPENSSLDIR/include中安装标头,在$OPENSSLDIR/lib中安装库。它不会安装手册页。

然后编译并链接:

$ gcc -I "$HOME/ssl/include" test.c -o test.exe "$HOME/ssl/lib/libcrypto.a" "$HOME/ssl/lib/libssl.a"

链接libcrypto.alibssl.a意味着您可以避免库路径问题。事情将会正常工作&#34;对你而言。

此外,如果您需要OpenSSL 1.0.1,那么您可以从1.0.2的 Configure (来自第613行):

$ grep "Cygwin-x86_64" Configure
"Cygwin-x86_64", "gcc:-DTERMIOS -DL_ENDIAN -O3 -Wall:::CYGWIN::SIXTY_FOUR_BIT_LONG RC4_CHUNK DES_INT DES_UNROLL:${x86_64_asm}:mingw64:dlfcn:cygwin-shared:-D_WINDLL:-shared:.dll.a",

如果您想要 config ,那么只需要工作&#34;对于1.0.1,然后添加以下内容。确保将 Cygwin-x86_64 的行添加到 Configure

x86_64-*-cygwin) OUT="Cygwin-x86_64" ;;     <== Add this in front of the ones below
*-*-cygwin_pre1.3) OUT="Cygwin-pre1.3" ;;
*-*-cygwin) OUT="Cygwin" ;;

答案 1 :(得分:0)

似乎1.0.1不支持Cygwin / x64。

This thread表示已将必要的补丁拉入1.0.2分支。

答案 2 :(得分:0)

这里有一个post你可以参考。基本思想是指定-march = x86-64并避免使用汇编语言。汇编语言不像c语言那样可移植。