为 OS X Xcode 项目编译 Crypto++ 库

Compile Crypto++ library for OS X Xcode project

我已经下载了 Crypto++,我正在尝试构建它以便在 C++ Xcode 项目中使用它。

我只使用 "make" 命令编译并在我的 xcode 的 c++ 项目中包含 libcryptopp.a。但它给出了错误:

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:
 ...

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

正如@halfelf 所说,您需要使用 LLVM 的运行时 (libc++),因为那是 Xcode 使用的。根据您拥有的 Crypto++ 版本,您可能(或可能不)使用 GNU 的运行时 (libstdc++)。

解决此问题的最简单方法是查看 Master。从 Master 开始工作是可以的,因为它基本上很稳定,只是偶尔会出现中断(大多数开发发生在一个单独的分支上)。

$ 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.

需要使用 Master,因为旧版本的 Crypto++ 不支持用户的 CXXCXXFLAGS。您过去必须编辑 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
...

您必须设置 Debug/Release 构建、符号级别和优化级别。 makefile 将添加其余标志。

上面有些人放弃了,因为它只添加了 -stdlib=libc++。你应该使用Xcode使用的CXXFLAGS来确保最无故障link。这些年来使用不同的 CXXFLAGS 引起了很多麻烦。


Crypto++ 是胖二进制安全的(unlike cURL and OpenSSL), so you should be able to perform the following. In fact, our test script tests this class of configurations(Intel 和 PPC 胖二进制,包括 C++03 到 C++17),所以它应该开箱即用:

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 i386Undefined symbols for architecture x86_64.


这里有一些相关的 Crypto++ wiki 页面,但它们适用于 iOS,而不适用于 OS X。它们大多适用,但不完全适用。

这是一篇关于从命令行构建库的 wiki 文章。您实际上遇到了 "Compilers and C++ Runtimes" 下讨论的痛点,但它并不明显: