2016-08-11 18 views
0

私は自分のシステムに静的にcryptoppをビルドしました。すべてのテストにも合格しています。これらは警告している私がテストQTプロジェクトでCrypto ++静的ライブラリを使用する

WARNING: CRYPTOPP_NO_UNALIGNED_DATA_ACCESS is not defined in config.h. 
WARNING: CRYPTOPP_INIT_PRIORITY is not defined in config.h. 
WARNING: CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 is defined in config.h. 
WARNING: You should make these changes in config.h, and not CXXFLAGS. 
WARNING: You can 'mv config.recommend config.h', but it breaks versioning. 
WARNING: See http://cryptopp.com/wiki/config.h for more details. 

中に取得するのに私は今

TEMPLATE = app 

LIBS += -L/usr/lib/libcryptopp.a 
#LIBS += -lcryptopp 

CONFIG += console c++11 
CONFIG += staticlib 

SOURCES += main.cpp \ 
hashdata.cpp 

HEADERS += \ 
hashdata.hpp 

としての私のQTプロジェクトファイルでこれをリンクしかし、私はこれをコンパイルするとき、私はすべての未定義エラーが発生します。

hashdata.o: In function `hashdata::hashfunction(std::string)': 
hashdata.cpp:(.text+0x1fb): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)' 
hashdata.cpp:(.text+0x270): undefined reference to `CryptoPP::SHA512::InitState(unsigned long long*)' 
hashdata.cpp:(.text+0x29a): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)' 
hashdata.cpp:(.text+0x2a1): undefined reference to `vtable for CryptoPP::StringSinkTemplate<std::string>' 
hashdata.cpp:(.text+0x30b): undefined reference to `CryptoPP::Filter::Filter(CryptoPP::BufferedTransformation*)' 
hashdata.cpp:(.text+0x312): undefined reference to `vtable for CryptoPP::Grouper' 
hashdata.cpp:(.text+0x35e): undefined reference to `CryptoPP::Filter::Detach(CryptoPP::BufferedTransformation*)' 
hashdata.cpp:(.text+0x375): undefined reference to `CryptoPP::Filter::Filter(CryptoPP::BufferedTransformation*)' 
hashdata.cpp:(.text+0x37c): undefined reference to `vtable for CryptoPP::BaseN_Encoder' 
hashdata.cpp:(.text+0x3d3): undefined reference to `CryptoPP::Filter::Detach(CryptoPP::BufferedTransformation*)' 
hashdata.cpp:(.text+0x3e5): undefined reference to `CryptoPP::ProxyFilter::ProxyFilter(CryptoPP::BufferedTransformation*, unsigned long, unsigned long, CryptoPP::BufferedTransformation*)' 
hashdata.cpp:(.text+0x3ec): undefined reference to `vtable for CryptoPP::HexEncoder' 
hashdata.cpp:(.text+0x452): undefined reference to `vtable for CryptoPP::AlgorithmParametersTemplate<int>' 
hashdata.cpp:(.text+0x4af): undefined reference to `vtable for CryptoPP::AlgorithmParametersTemplate<CryptoPP::ConstByteArrayParameter>' 
... 

私はgoogleで検索したときにこれまで同様の問題が発生していましたが、解決策は不明です。 C++ 11のフラグが原因である可能性がありますか?

+0

Crypto ++には、プロジェクトに含めるヘッダーがいくつかあります。あなたのプロジェクトファイルに 'HEADERS + = path/to/cryptopps/headers/you/are/using.hpp'のようなものを追加してください。 – ForceBru

+0

私のhashdata.hppに '' cryptopp/filters.h "'があり、QTはファイルが見つからないと言っていません。 'HEADER + ='に追加すると、これらのファイルがプロジェクトにコピーされます。しかし、とにかく試してみる。 – itsnevertoobadtoaskforhelp

+0

生成されるコマンドラインはありますか? –

答えて

1

私は自分のシステムに静的にcryptoppをビルドしました。すべてのテストにも合格しています。 私がテスト中に取得するのに、これらは警告している

WARNING:CRYPTOPP_NO_UNALIGNED_DATA_ACCESSはconfig.hの中で定義されていません。 警告:CRYPTOPP_INIT_PRIORITYはconfig.hで定義されていません。警告: CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562はconfig.hで定義されています。 警告:CXXFLAGSではなく、config.hでこれらの変更を行う必要があります。 警告:mv config.recommend config.hを実行できますが、バージョン管理は です。警告: 詳細については、http://cryptopp.com/wiki/config.hを参照してください。

私はこの警告にコメントすることができます。あなたはそれが言うの手順を実行する必要があります。

mv config.recommend config.h 

config.recommendは、ライブラリががバージョニングを壊すことなく除去することができなかったことを完全に知られている未定義の動作を回避することによって、より良い構成です置きます。バージョニングの問題(FedoraやDebianなど)がないように見えるので、移動を実行できます。


私は今あなたが暗号++をビルドすると、ライブラリとアプリのために同じコンパイラとフラグを使用する必要があります

TEMPLATE = app 

LIBS += -L/usr/lib/libcryptopp.a 
#LIBS += -lcryptopp 

CONFIG += console c++11 
... 

としての私のQTプロジェクトファイルでこれをリンクします。私は以下を提案する。

暗号++

# Be sure to 'mv config.recommend config.h' 
export CXXFAGS="-DNDEBUG -g2 -O3 -std=c++11" 
make static dynamic test 

のQtアプリケーション

# main.pro file 
QMAKE_CXXFLAGS += -DNDEBUG -g2 -O3 

また暗号++ウィキにGNUmakefile | Building the Libraryを参照してください。


hashdata.o: In function `hashdata::hashfunction(std::string)': 
hashdata.cpp:(.text+0x1fb): undefined reference to `CryptoPP::Algorithm::Algorithm(bool)' 
hashdata.cpp:(.text+0x270): undefined reference to `CryptoPP::SHA512::InitState(unsigned long long*)' 
... 

これらは、ソース(*.cpp)ファイルから来ています。 I推測している(とその純粋な推測)二つの問題の1:

  • QT Creatorはlibcryptopp.a
  • を使用していない

    • C++ 03 C++ 11対が不足しているシンボル
    • を引き起こしていますシンボルの検査には nmを使用してください。次のようなもの(「T」はその定義されたテキストのセクションで説明します):

      $ nm libcryptopp.a 2>/dev/null | c++filt | \ 
          grep 'Algorithm::Algorithm(bool)' | grep ' T ' 
      0000000000000060 T CryptoPP::Algorithm::Algorithm(bool) 
      0000000000000070 T CryptoPP::Algorithm::Algorithm(bool) 
      

      シンボルはQT創造主によって存在している場合Adding external library into Qt Creator projectのようなものを見た後、暗号++ライブラリを見つけていない

      。コメントから

      -lcryptopp作品、しかし、なぜ-L/usr/lib/libcryptopp.aがわからないのですか? ...静的ライブラリと動的ライブラリの両方を持っている人は、静的ライブラリを強制的にリンクする方法はまだ分かりません。

      libcryptopp.aのようなアーカイブは、オブジェクトファイルの集合です。あなたがリンカにライブラリパスを指定する-Lを使用

      # main.pro file 
      OBJECTS += /usr/lib/libcryptopp.a 
      

      want something likeあなたはので、あなたは、ないLIBSOBJECTSに追加します。 -L/usr/lib/libcryptopp.aはパスに使用されているのであまり意味がありません。


      追加のノートの両方の静的および動的LIBSが存在したとき、それは自動的にダイナミックLIBをリンクしていることです。静的リンクを強制する方法を知っていますか?

      Linuxでは、(1);またはまたは(2)/usr/lib/libcryptopp.aを直接指定する。暗号++ test program uses method (2):OS X上で

      g++ main.cpp /usr/lib/libcryptopp.a -o main.exe 
      

      は、リンカは常に動的オブジェクトにリンクします。それはiOS上でさえそうです、ユーザランドは通常動的オブジェクトを読み込むことができません。動的リンクを回避するには、(1)移動または名前を変更するか、または*.dylib。または(2)/usr/lib/libcryptopp.aを直接指定する。 Crypto ++ test program uses method (2)

      g++ main.cpp /usr/lib/libcryptopp.a -o main.exe 
      
    +0

    この回答に追加のコメント。私は紛失したシンボルをチェックしようとしましたが、何もありません。リンクはQTの正しい方法は 'LIBS + = - L /"です。PATH "-lcrptopp"はQTでリンクする正しい方法です。とにかくDEFAULT_PATHにあるので、パスは必要ありません。追加の注意点は、静的ライブラリと動的libの両方が存在する場合、動的libを自動的にリンクしていたことです。静的リンクを強制する方法を知っていますか? – itsnevertoobadtoaskforhelp

    関連する問題