我试图在openSSL中使用Sha512功能,但似乎不能让它工作,因为我刚刚开始编写代码中的编译器错误。我在.cpp文件的顶部包含#include <openssl/sha.h>
,然后在按钮事件的操作中,我只在下面输入以下代码。
SHA512_CTX ctx;
SHA512_Init(&ctx);
//Will uncomment below in later if I get SHA512_Init to work
//SHA512_Update(&ctx, string, strlen(string));
//SHA512_Final(digest, &ctx);
我收到链接器错误,告诉架构x86_64的未定义符号,暗示该函数不存在?
我知道QT 5有一个哈希函数,但我只限于QT 4.8,所以我不能使用QT 5+框架中提供的加密sha512哈希函数。
感谢任何帮助!
使用macports安装openssl
我使用的是Mac OS 10.9.2
制作文件
#-------------------------------------------------
#
# Project created by QtCreator 2014-06-11T20:27:49
#
#-------------------------------------------------
QT += core gui network
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = ExchangeTab
TEMPLATE = app
LIBS += -L/usr/include/openssl -openssl
INCLUDEPATH += /usr/include/openssl
SOURCES += main.cpp\
mainwindow.cpp \
httpsocket.cpp \
cloaksend.cpp \
exchange.cpp
HEADERS += mainwindow.h \
httpsocket.h \
cloaksend.h \
exchange.h
FORMS += mainwindow.ui
RESOURCES += \
AppResources.qrc
请寻找跨平台解决方案。
答案 0 :(得分:2)
您需要链接到正确的库(openSSL)
看看这里:How to Include OpenSSL in a Qt project
具体来说,将其添加到您的.pro
文件中。:
LIBS += -L/opt/local/lib/ -lcrypto
对于包含.h文件,请将此行添加到.pro文件中:
INCLUDEPATH += /opt/local/include
[1]表示默认包含路径为/opt/local/include/
。
答案 1 :(得分:1)
LIBS += -L/usr/include/openssl -openssl INCLUDEPATH += /usr/include/openssl
这看起来不正确。 OpenSSL库是libcrypto
(-lcrypto
)和libssl (
- lssl ). There is no
libopenssl (-lopenssl
)。尝试:
LIBS += -L/usr/lib -lcrypto
INCLUDEPATH += /usr/include/openssl
但是这些库是0.9.8版本。您可以考虑升级到1.0.1h。
$ ls /usr/lib | grep crypto
libcrypto.0.9.7.dylib
libcrypto.0.9.8.dylib
libcrypto.dylib
libk5crypto.dylib
和
$ /usr/bin/openssl version
OpenSSL 0.9.8y 5 Feb 2013
如果您选择升级,OpenSSL将安装到/usr/local/ssl
。避免将OpenSSL的版本与以下内容混合/匹配。
INCLUDEPATH += /usr/local/ssl/include/openssl
LIBS += /usr/local/ssl/lib/libcrypto.a
可以在LIBS
中指定对象和档案。请参阅How to add object files to a project in Qt。
答案 2 :(得分:0)
好的,所以我可能已经回答了我自己的问题,但我需要一些帮助来理解它的工作原理。
我的make文件确实是问题所在。我添加了以下3行。
INCLUDEPATH += $$OPENSSL_INCLUDE_PATH
LIBS += $$join(OPENSSL_LIB_PATH,,-L,)
LIBS += -lcrypto
然后它神奇地编译得很好。我在用QT编写的另一个用OpenSSL编译的项目中找到了这些。
有趣的是。我删除了前两行,所以只剩下以下内容。然后在我的项目上运行clean以确保代码正在重新编译。
LIBS += -lcrypto
这也只是“工作”没有链接器错误。看起来这是我需要的唯一命令。问题是......如果我在linux或windows上编写这些代码并进行编译,那将是跨平台友好的吗?我不确定,但这很有效。