...问题是:有没有一种方法来编译crypto ++,以便部署的lib将跨平台?
是的,但只限于处理器系列。
问题可能是使用了较新的指令,但不是AES。我怀疑有三个原因。
首先,makefile在构建时添加了-march=native
。这可以获得您正在构建的计算机的所有CPU功能。其次,新的指令可能来自SSE4,AVX或BMI,因为您在较新的Mac上编译;而您的旧款Mac只能处理Core2 Duo中的SSE4。第三,AES在运行时被保护,所以如果CPU缺少AESNI,那么这些特定的机器指令就不会被执行。但是,编译器可能发出的其他指令,例如AVX或BMI,则不受保护。
这里是我的OS X的测试环境:
- 的MacBook,2010年初
- 英特尔酷睿双核
- OS X 10.9
- SSE 4.1
- 的MacBook临,201年底2
- 英特尔酷睿i7
- OS X 10.8
- SSE 4.1,SSE 4.2,AESNI,RDRAND,AVX
基于上面的列表上,如果我编译在MacBook Pro(SSE 4.1,SSE 4.2,AESNI,RDRAND,AVX)用于MacBook(SSE 4.1),那么我需要将目标机器限制为SSE 4.1。否则,Clang肯定会发出较旧的MacBook无法处理的指令。
要限制在加密++目标机器:
git clone https://github.com/weidai11/cryptopp.git
cd cryptopp
export CXXFLAGS="-DNDEBUG -g2 -O2 -DDISABLE_NATIVE_ARCH=1 -msse2 -msse3 -mssse3 -msse4.1"
make -j 4
-DDISABLE_NATIVE_ARCH
是一个相对较新的补充。我不相信它在Crypto ++ 5.6.5中。你需要Master,它将在即将到来的Crypto ++ 6.0中。
如果您需要删除添加-march=native
的makefile代码,那么它不难找到。围绕线200打开GNUmakefile
,并删除此块:
# BEGIN_NATIVE_ARCH
# Guard use of -march=native (or -m{32|64} on some platforms)
# Don't add anything if -march=XXX or -mtune=XXX is specified
ifeq ($(DISABLE_NATIVE_ARCH),0)
ifeq ($(findstring -march,$(CXXFLAGS)),)
ifeq ($(findstring -mtune,$(CXXFLAGS)),)
ifeq ($(GCC42_OR_LATER)$(IS_NETBSD),10)
CXXFLAGS += -march=native
else ifneq ($(CLANG_COMPILER)$(INTEL_COMPILER),00)
CXXFLAGS += -march=native
else
# GCC 3.3 and "unknown option -march="
# Ubuntu GCC 4.1 compiler crash with -march=native
# NetBSD GCC 4.8 compiler and "bad value (native) for -march= switch"
# Sun compiler is handled below
ifeq ($(SUN_COMPILER)$(IS_X64),01)
CXXFLAGS += -m64
else ifeq ($(SUN_COMPILER)$(IS_X86),01)
CXXFLAGS += -m32
endif # X86/X32/X64
endif
endif # -mtune
endif # -march
endif # DISABLE_NATIVE_ARCH
# END_NATIVE_ARCH
之后,你应该能够在两台机器上运行二进制文件。
GNUmakefile是一种怪物。这有很多。我们在Crypto ++ wiki上的GNUmakefile上记录了它。
您还可以使用-mtune
限制您正在编译的机器。例如:
$ export CXXFLAGS="-DNDEBUG -g2 -O2 -mtune=core2"
$ make -j 3
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c cryptlib.cpp
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c cpu.cpp
g++ -DNDEBUG -g2 -O2 -mtune=core2 -fPIC -pipe -c integer.cpp
...
首先,我想从酿造安装加密++和我的应用程序链接...
我不使用啤酒,所以我不知道使用时如何设置CXXFLAGS
。希望其中一位家酿者会提供一些关于它的信息。
也许Build and install Brew apps that are x86_64 instead of i386?和Using Homebrew with alternate GCC将有所帮助。
也可以在x86_64机器上编译,然后尝试在i386机器上运行它。如果是这样的话,那么它可能无法工作。
您可能可以用以下方式构建一个胖库,并且它可能在两台机器上都可以工作。注意增加了-arch x86_64 -arch i386
。
export CXXFLAGS="-DNDEBUG -g2 -O2 -DDISABLE_NATIVE_ARCH=1 -arch x86_64 -arch i386 -msse2 -msse3 -mssse3 -msse4.1"
make -j 4
您可能也对Crypto ++ wiki上的iOS (Command Line)感兴趣。它详细介绍了iOS上下文中的胖二进制文件。相同的概念适用于OS X.
如果遇到编译错误-msse4.1
或-msse4.2
,那么你可能需要-msse4_1
或-msse4_2
。不同的编译器接受(或期望)稍微不同的语法。
对于使用Linux进行比较,以下是Core2 Duo与第三代Core i5之间的CPU功能差异。注意Core i5有SSE4.2和AVX,而Core2 Duo没有。 AVX带来了巨大的变化,编译器积极使用指令集。在OS X上,你想运行sysctl machdep.cpu.features
。我从2010年初向我的旧款MacBook展示了一款。
酷睿:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 58
model name : Intel(R) Core(TM) i5-3230M CPU @ 2.60GHz
...
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx rdtscp lm constant_tsc
rep_good nopl xtopology nonstop_tsc cpuid pni pclmulqdq ssse3 cx16 sse4_1
sse4_2 x2apic popcnt aes xsave avx rdrand hypervisor lahf_lm
Core2双核:
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 23
model name : Intel(R) Core(TM)2 Duo CPU T6500 @ 2.10GHz
...
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca
cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx lm
constant_tsc arch_perfmon pebs bts rep_good nopl aperfmperf pni dtes64
monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm
Core Duo处理器(的MacBook):
$ sudo sysctl machdep.cpu.features
machdep.cpu.features: FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE
MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 DTES64
MON DSCPL VMX SMX EST TM2 SSSE3 CX16 TPR PDCM SSE4.1
感谢您的时间和@jww这个漫长和描述这个问题,编译cryptopp本Answare的帮助后,我已经得到了不同的连接错误,我会固定链接错误 – zapredelom
@zapredelom之后来到这个帖子leater - 那么,它很难说,因为没有细节。你应该提供的非法指令(哪一个?)的详细信息,并提供两款机器的细节。关于链接错误,你应该问,因为比这个问题的不同的新问题。 – jww
谢谢。我修好了我的所有问题,你建议编译塔方式和它的工作。但有一个例外。最新提交cryptopp LIB链接包含了一些错误,所以我下载了最新的官方版本 – zapredelom