2016-08-18 10 views
1

私はCrypto ++をダウンロードしましたが、C++ Xcodeプロジェクトで使用できるようにビルドしようとしています。OS X Xcodeプロジェクト用のCrypto ++ライブラリをコンパイル

「make」コマンドを使用してコンパイルし、libcryptopp.aを自分のxcodeのC++プロジェクトに含めました。しかし、エラーを与えている:

Undefined symbols for architecture i386: "CryptoPP::HashFilter::HashFilter(CryptoPP::HashTransformation&, 
CryptoPP::BufferedTransformation*, bool, int, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, 
std::__1::allocator<char> > const&)", referenced from: 
... 
+0

デフォルトのmakeは '-march = native'オプションでそれを構築しますこれはx86_64バイナリにつながります。 – halfelf

+0

どうすればいいですか? @halfelf –

+0

Common Cryptoを使用するだけではなく、すべて「C」コードであり、ハードウェアサポートの最適化が行われています。 – zaph

答えて

1

I compiled using just "make" command and included libcryptopp.a in my c++ project of my xcode. But it is giving errors ...

@halfelfが言ったように、あなたはそれはXcodeのが使用するものであるため、LLVMのランタイム(libc++)を使用する必要があります。あなたが持っているCrypto ++のバージョンによっては、GNUランタイム(libstdc++)を使用しているかもしれません。

これを修正する最も簡単な方法は、Masterをチェックアウトすることです。そのマスターは安定しており、時折ブレークする(ほとんどの開発は別のブランチで行われる)ので、マスターからの作業はOKです。暗号++の古いバージョンでは、ユーザーのCXXCXXFLAGSを尊重していなかったので、マスターを使用して

$ git clone https://github.com/weidai11/cryptopp 
Cloning into 'cryptopp'... 
remote: Counting objects: 9116, done. 
remote: Total 9116 (delta 0), reused 0 (delta 0), pack-reused 9116 
Receiving objects: 100% (9116/9116), 8.05 MiB | 6.53 MiB/s, done. 
Resolving deltas: 100% (6406/6406), done. 
Checking connectivity... done. 

が必要です。あなたはそれを修正するためにmakefileを編集する必要がありました。

次に、以下の手順を実行します。

export CXXFLAGS="-DNDEBUG -g2 -O2 -stdlib=libc++" 
$ CXX=clang++ make -j 4 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c cryptlib.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c cpu.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c shacal2.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -fPIC -march=native -pipe -c md5.cpp 
... 

デバッグ/リリースビルド、シンボルレベルと最適化レベルを設定する必要があります。 makefileは残りのフラグを追加します。

-stdlib=libc++が追加されているだけなので、上記の手の届かないところがあります。最も問題のないリンクを確保するためにXcodeが使用するCXXFLAGSを使用する必要があります。異なったCXXFLAGSを使用することは長年にわたって多くの問題を引き起こしました。


暗号++がfat-バイナリセーフ(unlike cURL and OpenSSL)であるので、あなたは次のことを行うことができるはずです。実際には、それはあなたのために箱から出して動作するはずですので、our test script tests this class of configurations(C++〜17 C++ 03を含むIntelとPPC脂肪のバイナリ、):

export CXXFLAGS="-DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64" 
$ CXX=clang++ make -j 4 
$ make -j 4 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c cryptlib.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c cpu.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c shacal2.cpp 
clang++ -DNDEBUG -g2 -O2 -stdlib=libc++ -arch i386 -arch x86_64 -fPIC -march=native -pipe -c md5.cpp 
... 

Undefined symbols for architecture i386を避けることができます両方のアーキテクチャを使用し、 Undefined symbols for architecture x86_64


ここにいくつかの関連するCrypto ++ wikiページがありますが、iOS用でありOS X用ではありません。ほとんどが適用されますが、正確には適用されません。

ここでは、コマンドラインからライブラリを構築する上でのWikiの記事です。あなたが実際に「コンパイラおよびC++ランタイム」の下で議論痛みのポイントを打つが、その容易に明らかにしていない:

+0

ビルドエラーが発生します: –

+0

@ user7234 - 新しい質問を開き、詳細を入力してください。 – jww

+0

clang ++ -DNDEBUG -g2 -O2 -stdlib = libC++ -arch i386 -arch x86_64 -fPIC -march = native -pipe -c camellia.cpp cpu.cpp:104:4:エラー:レジスタ%rbxは64でのみ使用可能ですビットモード "pushq %% rbx; cpuid; mov %% ebx、%% edi; popq %% rbx" :1:8:注:アセンブリにインスタンス化されました pushq%rbx; cpuid; mov%ebx、%edi; popq%rbx ^ ~~~~ cpu.cpp:104:4:エラー:レジスタ%rbxは64ビットモードでのみ使用可能です "pushq %% rbx; cpuid; mov %% ebx、%% edi; popq %% rbx " –

関連する問題