3

次のCrypto++(暗号化スキームのC ++クラスライブラリ)の例を取得して、clang++を使用するiMacで動作させようとしています。

SHA256 hash;

byte digest[ SHA256::DIGESTSIZE ];

hash.CalculateDigest( digest, (byte*) &value[ 0 ], value.size( ) );

HexEncoder encoder;

string result = String::empty;

encoder.Attach( new StringSink( result ) );

encoder.Put( digest, sizeof( digest ) );

encoder.MessageEnd( );

ビルドコマンド

Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
Target: x86_64-apple-darwin11.4.0
Thread model: posix
 "/usr/bin/clang" -cc1 -triple x86_64-apple-macosx10.7.4 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name checksum_impl.cpp -pic-level 2 -mdisable-fp-elim -relaxed-aliasing -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 123.2.1 -v -resource-dir /usr/bin/../lib/clang/2.1 -D framework_EXPORTS -I /Users/Ben/Dropbox/appon/build/../source -nostdinc++ -cxx-isystem /usr/include/c++/v1 -Wall -Wextra -Weffc++ -pedantic -std=c++0x -fdeprecated-macro -ferror-limit 19 -fmessage-length 175 -stack-protector 1 -fblocks -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o CMakeFiles/framework.dir/Users/Ben/Dropbox/source/example.cpp.o -x c++ /Users/Ben/Dropbox/source/example.cpp
clang -cc1 version 2.1 based upon llvm 3.0svn hosted on x86_64-apple-darwin11.4.0
#include "..." search starts here:
#include <...> search starts here:
 /Users/Ben/Dropbox/build/../source
 /usr/include/c++/v1
 /usr/local/include
 /usr/bin/../lib/clang/2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

リンカー出力

clang: warning: argument unused during compilation: '-std=c++0x'
Undefined symbols for architecture x86_64:
  "CryptoPP::Filter::TransferTo2(CryptoPP::BufferedTransformation&, unsigned long long&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::Filter::CopyRangeTo2(CryptoPP::BufferedTransformation&, unsigned long long&, unsigned long long, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool) const", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::ChannelCreatePutSpace(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long&)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::ChannelPut2(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned char const*, unsigned long, int, bool)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::ChannelPutModifiable2(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned char*, unsigned long, int, bool)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::ChannelFlush(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool, int, bool)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::ChannelMessageSeriesEnd(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, int, bool)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
  "CryptoPP::BufferedTransformation::SetRetrievalChannel(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)", referenced from:
      vtable for CryptoPP::SimpleProxyFilter in checksum_impl.cpp.o
      vtable for CryptoPP::Bufferless<CryptoPP::Filter> in checksum_impl.cpp.o
      vtable for CryptoPP::Unflushable<CryptoPP::Filter> in checksum_impl.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [all] Error 2

以前のバージョン5.6.1はclang++でビルドできないため、最新の開発バージョンのCrypto++5.6.2を使用しています。ただし、x86_64アーキテクチャのシンボルが欠落しているというビルドの問題が発生しています。

ヒントをいただければ幸いです。

4

4 に答える 4

3

Crypto ++ 5.6.2は、makeオプションを使用してLLVMバージョン6.1.0(clang-602.0.53)で正常にビルドされます。

CXXFLAGS="-std=c++11 -stdlib=libstdc++ -DCRYPTOPP_DISABLE_ASM -Wno-c++11-narrowing"

したがって、このスクリプト:https ://github.com/mapnik/mapnik-packaging/blob/master/osx/scripts/build_cryptopp.sh

-stdlib =libstdc++はMavericks以降のMacOSXの必要性を参照してください。フラグ-stdlib=libstdc++を使用する必要があるのはいつですか。

于 2015-09-04T17:18:08.663 に答える
2

-lcryptoppコンパイラコマンドで使用して、これらのシンボルを提供するライブラリにリンクする必要があります。これはlibcryptopp.soである必要があります。

「ビルドコマンド」(実行しているコマンドではなく、実行しているコマンドの出力です。実際のコマンドを表示すると読みやすくなります)を見ると、コンパイルしているように見えます。.cppファイルをファイルに変換し.oますが、リンカエラーが発生します。これは、ファイルの生成が通常、リンクする.oのステップであるため、奇妙なことです。あなたはどのようなステップを行おうとしていますか?たぶん、コンパイルするだけでリンクを試みないように追加する必要もあります。リンクするときはまだ必要です。-c-lcryptopp

于 2012-06-28T20:12:52.587 に答える
1

Jonathonの答えに加えて、これは指定されたときに -lcryptoppかなり一般的な問題であるため...

アーキテクチャx86_64の未定義のシンボル。CryptoPP::Filter::TransferTo2(CryptoPP::BufferedTransformation&, unsigned long long&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, bool)"..。

__1、LLVM C ++ランタイム(libc++)を使用していることを示します。どこかで、おそらくGNU C ++ランタイム(libstdc++)と混合して一致させています。GNU C ++ランタイム(libstdc++)には、__1そのシンボルの装飾がありません。

プロジェクトすべてのビルド済みライブラリを調べて、どちらか一方を使用していることを確認する必要があります。CXXFLAGSそれぞれについて、(1)-stdlib=libc++(LLVM)または(2)-stdlib=libstdc++(GNU)のいずれかを使用する必要があります。

-stdlib=...XcodeなどのIDEは、Crypto++とは異なる設定を使用する場合があることに注意してください。この場合、XcodeをCrypto ++と一致させるか、Crypto++ライブラリを再構築してXcodeと一致させます。

XcodeがLLVMを使用しlibc++ていて、Crypto ++を再構築する必要がある場合は、を開いてGNUmakefileこのセクションを作り直してください(90行目あたり)。

ifeq ($(UNAME),Darwin)
  AR = libtool
  ARFLAGS = -static -o
  CXX = c++
  IS_GCC2 = $(shell $(CXX) -v 2>&1 | $(EGREP) -c gcc-932)
ifeq ($(IS_GCC2),1)
    CXXFLAGS += -fno-coalesce-templates -fno-coalesce-static-vtables
    LDLIBS += -lstdc++
    LDFLAGS += -flat_namespace -undefined suppress -m
endif
endif

LLVMを使用する場合はlibc++、以下を削除します。

# GNU C++ Runtime
LDLIBS += -lstdc++

そして追加:

# LLVM C++ Runtime
CXXFLAGS += -stdlib=libc++

完全を期すために、GNUのランタイムを使用する場合は、を削除しLDLIBS += -lstdc++て追加しCXXFLAGS += -stdlib=libstdc++ます。

環境またはコマンドラインで指定されていない場合にmakefileが使用するようにに変更することもできCXX = c++ます。CXX ?= c++c++


興味がある場合__1は、バージョン管理に使用されるインライン名前空間です。インライン名前空間とは何ですか?を参照してください。LLVMのlibc++を使用する場合、__1シンボルはどこから来ますか?

于 2015-03-27T04:02:00.407 に答える
0

この問題は、Crypto++がllvm-clang++に移植されていないことに関連していました。サポートされているコンパイラについては、ここを参照してください。

私の解決策は、GCryptを使用することでした。

申し訳ありませんが、失敗の原因の詳細を提供することはできません。

于 2012-07-14T15:22:07.390 に答える