我已经在我的系统上静态构建了 cryptopp,它也通过了所有测试。
这些是我在测试期间收到的警告
警告:config.h 中未定义 CRYPTOPP_NO_UNALIGNED_DATA_ACCESS。
警告:config.h 中未定义 CRYPTOPP_INIT_PRIORITY。警告:
CRYPTOPP_MAINTAIN_BACKWARDS_COMPATIBILITY_562 在 config.h 中定义。
警告:您应该在 config.h 中进行这些更改,而不是在 CXXFLAGS 中。
警告:您可以“mv config.recommend config.h”,但它会损坏
版本控制。警告:参见http://cryptopp.com/wiki/config.h 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++ 时,您应该为库和应用程序使用相同的编译器和标志。我建议如下。
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
另请参阅GNUmake 文件 |建设图书馆 http://www.cryptopp.com/wiki/GNUmakefile#Building_the_Library在 Crypto++ wiki 上。
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 与 C++11 导致符号丢失
- QT Creator 未使用
libcryptopp.a
Use 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 Creator 存在符号未找到 Crypto++ 库,则查看类似内容将外部库添加到 Qt Creator 项目中 https://stackoverflow.com/q/718447.
来自评论:
-lcryptopp
有效,但我不知道为什么-L/usr/lib/libcryptopp.a
没有。 ...因为如果一个人同时拥有静态库和动态库,我仍然不知道如何强制链接静态库。
一个档案,比如libcryptopp.a
,是目标文件的集合。您将其添加到OBJECTS
, not LIBS
, 那么你想要类似的东西 https://stackoverflow.com/questions/20874587/adding-object-o-files-to-qtcreator-project:
# main.pro file
OBJECTS += /usr/lib/libcryptopp.a
You use -L
指定链接器的库路径。没有多大意义-L/usr/lib/libcryptopp.a
因为它用于路径。
额外注意的是,当静态和动态库都存在时,它会自动链接动态库。你知道如何强制静态链接吗?
在 Linux 上,您可以通过以下任一方式强制静态链接:(1)-Bstatic -lcryptopp
;或 (2) 直接指定/usr/lib/libcryptopp.a
。加密++测试程序采用方法(2) http://www.cryptopp.com/wiki/GNUmakefile#Creating_Programs:
g++ main.cpp /usr/lib/libcryptopp.a -o main.exe
在 OS X 上,链接器始终链接到动态对象。它甚至在 iOS 上也是如此,通常不允许用户空间加载动态对象。为了避免动态链接,(1) 移动或重命名*.dylib
;或 (2) 直接指定/usr/lib/libcryptopp.a
。加密++测试程序采用方法(2) http://www.cryptopp.com/wiki/GNUmakefile#Creating_Programs:
g++ main.cpp /usr/lib/libcryptopp.a -o main.exe