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

时间:2016-08-18 06:34:42

标签: c++ xcode macos crypto++

我已经下载了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:
 ...

1 个答案:

答案 0 :(得分:2)

  

我使用“make”命令编译,并在我的xcode的c ++项目中包含了libcryptopp.a。但这是错误的......

正如@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
...

您必须设置调试/发布版本,符号级别和优化级别。 makefile将添加其余的标志。

上面有一些手放弃,因为它只添加了-stdlib=libc++。您应该使用Xcode使用的CXXFLAGS来确保最无故障的链接。多年来,使用不同的CXXFLAGS导致了很多麻烦。

Crypto ++是胖二进制安全的(unlike cURL and OpenSSL),因此您应该能够执行以下操作。事实上,our test script tests this class of configurations(英特尔和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 i386 Undefined symbols for architecture x86_64

以下是一些相关的Crypto ++ wiki页面,但它们适用于iOS,而不适用于OS X.它们主要适用,但不完全适用。

这是一篇关于从命令行构建库的wiki文章。你实际上遇到了“编译器和C ++运行时”中讨论的痛点,但它不是很明显: