...質問があります:暗号化された++をコンパイルする方法がありますので、展開されたライブラリはクロスプラットフォームですか?
はい、ただし、プロセッサファミリ内のみです。
問題は新しい命令を使用する可能性がありますが、AESでは使用できません。私がそれを疑う3つの理由があります。
まず、メークファイルはビルド時に-march=native
を追加します。これにより、あなたが構築しているマシンのすべてのCPU機能が得られます。
新しいMacでコンパイルするので、新しい命令はSSE4、AVXまたはBMIからのものである可能性があります。古いMacではCore2 Duoの場合はSSE4しか扱えませんが、
第3に、AESは実行時にガードされるため、CPUにAESNIがない場合、これらの特定のマシン命令は実行されません。ただし、AVXやBMIのように、コンパイラが発行する可能性のある他の命令は保護されません。
、私は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で信じていません。あなたはそれのためにマスターが必要で、それは今後のCrypto ++ 6.0になります。
-march=native
を追加するメークファイルコードを削除する必要がある場合は、それを見つけるのは難しくありません。 GNUmakefile
を開き、ライン200の周りにこのブロックを削除します。その後
# 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のコンテキストで脂肪のバイナリに関するいくつかの詳細に入ります。同じ概念は、あなたが-msse4.1
や-msse4.2
のためにコンパイルエラーが発生した場合は、あなたが-msse4_1
か-msse4_2
が必要な場合がありますOS Xの
に適用されます。異なるコンパイラは、わずかに異なる構文を受け入れる(または期待する)。
Linuxを使って比較すると、Core2 Duoと3rd gen Core i5のCPU機能の違いは次のとおりです。 Core i5にはSSE4.2とAVXがあり、Core2 Duoにはないことに注意してください。 AVXは違いを生み出し、コンパイラは積極的に命令セットを使用します。
OS Xでは、sysctl machdep.cpu.features
を実行します。私は2010年初めから古いMacBook用のものを示した。
コアi5:
$ 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
コア2デュオ:
$ 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
あなたのお時間をありがとう、この長い説明的な答え、このanswareの助けを借りてcryptoppをコンパイルした後、私はリンクエラーを修正した後、この投稿に来るでしょう – zapredelom
@zapredelom - まあ、細部がないので、言いにくいです。あなたは違法な指示の詳細を提供するべきですか(どちらですか?)、あなたの2台のマシンの詳細を提供してください。リンクエラーに関しては、この質問とは異なるので、おそらく新しい質問をするべきです。 – jww
ありがとうございます。私はすべての私の問題を修正し、あなたが提案した方法でそれを編集し、それがうまくいった。 1つ例外があります。最新のcryptopp libにはリンクエラーが含まれていたので、私は公式の最新リリース – zapredelom