在QT项目中使用Crypto ++静态库

时间:2016-08-11 10:07:59

标签: c++ linux qt crypto++

  

我已经在我的系统上静态构建了cryptopp,它也通过了所有测试。这些是我在测试期间得到的警告

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.

我现在将其作为

链接到我的QT项目文件中
TEMPLATE = app

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

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

SOURCES += main.cpp \
hashdata.cpp

HEADERS += \
hashdata.hpp

但是当我编译它时,我得到所有未定义的错误。

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>'
...

我之前在谷歌搜索时遇到过类似的问题,但解决方案并不清楚。可能是因为C ++ 11标志?

1 个答案:

答案 0 :(得分:2)

  

我已经在我的系统上静态构建了cryptopp,它也通过了所有测试。   这些是我在测试期间得到的警告

     
    

警告:config.h中未定义CRYPTOPP_NO_UNALIGNED_DATA_ACCESS。     警告:config.h中未定义CRYPTOPP_INIT_PRIORITY。警告:     CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562在config.h中定义。     警告:您应该在config.h中进行这些更改,而不是CXXFLAGS。     警告:您可以修改config.h&#39;,但它会中断     版本。警告:有关详情,请参阅http://cryptopp.com/wiki/config.h     的信息。

  

我可以评论这个警告。您应该执行它所说的步骤:

mv config.recommend config.h

config.recommend通过完全避免在不破坏版本控制的情况下无法删除已知的未定义行为,使库成为更好的配置。由于您似乎没有版本问题(例如Fedora或Debian),因此您可以执行此操作。

  

我现在将其作为

链接到我的QT项目文件中
TEMPLATE = app

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

CONFIG += console c++11
...

构建Crypto ++时,应该为库和应用程序使用相同的编译器和标志。我建议如下。

<强> 加密++

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

Qt App

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

另请参阅Crypto ++ wiki上的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)文件。我猜测(并且纯粹是猜测)两个问题之一:

  • C ++ 03 vs C ++ 11导致缺少符号
  • QT Creator未使用libcryptopp.a

使用nm检查符号。类似下面的内容(&#39; T&#34;告诉你它的定义和文本部分):

$ 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 Creator存在符号,则找不到Crypto ++库,请参阅Adding external library into Qt Creator project之类的内容。

来自评论

  

-lcryptopp有效,但我不知道为什么-L/usr/lib/libcryptopp.a没有。 ...因为如果一个人同时拥有静态和动态库,我仍然不知道如何强制链接静态库。

档案,如libcryptopp.a,是目标文件的集合。您将其添加到OBJECTS,而不是LIBS,因此您want something like

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

使用-L指定链接器的库路径。 -L/usr/lib/libcryptopp.a因为它用于路径,所以没有多大意义。

  

另外需要注意的是,当静态库和动态库都存在时,它会自动链接动态库。你知道如何强制静态链接吗?

在Linux上,您可以通过(1)-Bstatic -lcryptopp强制静态链接;或(2)直接指定/usr/lib/libcryptopp.a。 Crypto ++ test program uses method (2)

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

在OS X上,链接器始终链接到动态对象。它甚至在iOS上也是如此,通常不允许userland加载动态对象。为了避免动态链接,可以(1)移动或重命名*.dylib;或(2)直接指定/usr/lib/libcryptopp.a。 Crypto ++ test program uses method (2)

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