我已经下载了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:
...
答案 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 ++不会尊重用户的CXX
和CXXFLAGS
。您以前必须编辑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 ++运行时”中讨论的痛点,但它不是很明显: