C++ 通过OpenSSL在QT中实现Sha512哈希

C++ 通过OpenSSL在QT中实现Sha512哈希,c++,macos,qt,openssl,sha512,C++,Macos,Qt,Openssl,Sha512,我试图在openSSL中使用Sha512函数,但似乎无法使其正常工作,因为我刚开始编写代码时就遇到了编译器错误。我将#include包含在.cpp文件的顶部,然后在按钮事件的操作中,我将下面的代码放在下面 SHA512_CTX ctx; SHA512_Init(&ctx); //Will uncomment below in later if I get SHA512_Init to work //SHA512_Update(&ctx, string, strlen(stri

我试图在openSSL中使用Sha512函数,但似乎无法使其正常工作,因为我刚开始编写代码时就遇到了编译器错误。我将
#include
包含在.cpp文件的顶部,然后在按钮事件的操作中,我将下面的代码放在下面

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的未定义符号,这意味着该函数不存在

我知道Qt5有一个散列函数,但我仅限于Qt4.8,因此无法使用Qt5+框架中可用的加密sha512散列函数

感谢您的帮助

使用macports安装openssl

我正在使用MacOS10.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

请寻找跨平台解决方案。

您需要链接到正确的库(openSSL)

请看这里:

具体来说,请将其添加到您的
.pro
文件中:

LIBS += -L/opt/local/lib/ -lcrypto
要包含.h文件,请将此行添加到.pro文件中:

INCLUDEPATH += /opt/local/include
[]表示默认包含路径为
/opt/local/include/

这看起来不正确。OpenSSL库是
libcrypto
-lcrypto
)和
libssl(
-lssl
)。没有
libopenssl
(-lopenssl
)。尝试:


但是这些库的版本是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

如果选择升级,OpenSSL将安装到
/usr/local/ssl
。避免将OpenSSL版本与以下内容混合/匹配

INCLUDEPATH += /usr/local/ssl/include/openssl
LIBS += /usr/local/ssl/lib/libcrypto.a

可以在
LIBS
中指定对象和存档。请看。

好的,我可能已经回答了我自己的问题,但我需要一些帮助来理解它为什么有效

我的make文件确实是个问题。我添加了以下3行

INCLUDEPATH += $$OPENSSL_INCLUDE_PATH
LIBS += $$join(OPENSSL_LIB_PATH,,-L,)
LIBS += -lcrypto
然后它神奇地编译得很好。我在另一个为OpenSSL编译的QT项目中发现了这些

很有趣。我去掉了上面的两行,所以只剩下下面的几行。然后在我的项目上运行clean,以确保代码正在重新编译

LIBS += -lcrypto

这也只是“工作”没有链接器错误。看来这是我唯一需要的命令。问题是。。。如果我使用这段代码并在linux或windows上编译,这会是跨平台友好的吗?我不确定,但这起作用。

链接器错误意味着您没有链接到正确的库。请在问题中包含make-/cmake文件。另外,请说明您使用的是什么操作系统。Mac OS 10.9.2,我将在一秒中包含make文件。根据要求,make文件可用。谢谢你的关注!经过一些研究,我认为我的问题可能是我没有在makefile中使用LIBS或INCLUDEPATH,不知如何为openSSL或在何处安装openSSL。我用macports安装了最新的openSSLI,其实我只是在那里看看,但我不确定mac的include路径是什么,有什么想法吗?我编辑了makefile以显示我认为的路径,但仍然不起作用,相同的链接器错误。您的做法肯定是正确的。它应该在
/opt/local/include
附近。库路径将是
/usr/local/lib
应该说,当使用macports安装时。仍然不起作用,下面是我尝试的LIBS+=-L/opt/local/include/-openssl INCLUDEPATH+=/opt/local/include/I在其他地方读到的,为了使这个跨平台友好,我可能必须使用一种叫做openssl_lib_path的东西,知道那是什么吗?我还尝试了libs部分,让它转到/usr/local/lib,甚至在终端中导航以查看文件是否确实存在,openssl确实存在,奇怪的是没有.h(我们刚刚意识到它是一个包含更多.h文件的目录)。谢谢。看起来你帖子中的-lcrypto似乎是我找到的解决方案的关键。我很好奇你能否解释我的解决方案为什么有效?是的,它应该是跨平台友好的。但是,您需要一种自动找到lib路径的方法。我不确定在这种情况下选择什么作为正确答案,但我确实有另一个问题,您也可以提供帮助。它位于()。我让SHA工作,只是想让它现在和HMAC一起工作。我想我差点就明白了,也许你能帮我解决我做错的事?非常感谢迄今为止所有的建议!这真的很有帮助!
INCLUDEPATH += /usr/local/ssl/include/openssl
LIBS += /usr/local/ssl/lib/libcrypto.a
INCLUDEPATH += $$OPENSSL_INCLUDE_PATH
LIBS += $$join(OPENSSL_LIB_PATH,,-L,)
LIBS += -lcrypto
LIBS += -lcrypto