繁体   English   中英

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

[英]Compile Crypto++ library for OS X Xcode project

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

我只使用“ 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:
 ...

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

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

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

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


Crypto ++是胖二进制文件安全的( 不同于cURL和OpenSSL ),因此您应该能够执行以下操作。 实际上, 我们的测试脚本会测试此类配置 (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 i386 Undefined symbols for architecture x86_64


这是一些相关的Crypto ++ Wiki页面,但它们适用于iOS,而不适用于OSX。它们大多适用,但不完全适用。

这是有关从命令行构建库的Wiki文章。 您实际上已经达到了“编译器和C ++运行时”中讨论的难点 ,但是它并不容易理解:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM