C中的X509_NAME宏将无法编译

时间:2018-03-27 04:57:27

标签: c openssl

这是一个愚蠢的编译错误,但对于我的生活,我无法找出什么是错的。我花了几个小时,但我没有取得任何进展。我当然不了解OpenSSL以了解X509_NAME是什么。

我正在编译一个小C文件,如果有人调用文件中30个左右的函数之一,它的功能是打印出错误信息,表示C程序不支持30个SSL函数。每个功能大约3行(见下文)。从win32的OpenSSL openssl/X509.h文件复制调用接口。 (我正在运行Windows10 x64,但是使用VStudio 2017命令行进行编译,设置为32位)。

以下是openssl / x509.h包含文件的原始界面:

int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len);

由于原来的x509.h包含文件里面写着“Win32上X509_NAME的定义位于wincrypt.h中”,我将X509_NAME宏的定义直接复制到我的源文件中,如图所示下方。

我的简单错误消息函数的代码如下。我刚从openssl/x509.h文件中复制了接口定义并将其转换为函数:

#define X509_NAME ((LPCSTR) 7) /* copied from wincrypt.h */
int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len) {
    print_error (E_NO_SSL_SUPPORT);
    return (-1);
}

当我尝试使用针对32位的VS 2017命令行编译器编译代码时,我收到这些错误消息。第236行包含麻烦的代码行int X509_NAME_...

cl   /c /Od /nologo /MT /I. "-I..\s" ..\s\stubssl.c
stubssl.c
..\s\stubssl.c(236): error C2143: syntax error: missing ')' before '('
..\s\stubssl.c(236): error C2091: function returns function
..\s\stubssl.c(236): error C2059: syntax error: ')'
..\s\stubssl.c(236): error C2143: syntax error: missing ')' before 'constant'
..\s\stubssl.c(236): error C2143: syntax error: missing '{' before 'constant'
..\s\stubssl.c(236): error C2059: syntax error: 'constant'
..\s\stubssl.c(242): error C2059: syntax error: '<parameter-list>'
c:\stubssl\winxp\make.exe: *** [stubssl.obj] Error 2

我与另一个更简单的函数(但也使用X509_NAME宏)得到了同样的错误。它从第242行开始(参见上面的错误消息)。

X509_NAME *X509_get_subject_name(X509 *a) {
    hio_oerror (E_NO_SSL_SUPPORT);
    return (NULL);
}

有没有人知道如何尝试解决此问题?它看起来很简单,但对我来说却难以解决。我无法想象在''''之前我怎么会错过')'。

编辑:我在stubssl.c中的包含文件:

#define WIN32_LEAN_AND_MEAN
#include "openssl/ssl.h"
#include "openssl/x509.h"
#include "openssl/bio.h"
#include "openssl/pem.h"

1 个答案:

答案 0 :(得分:5)

在openSSL中,X509_NAME是一种类型,但<wincrypt.h>将其定义为值(((LPCSTR) 7))。不要自己定义,但请使用openSSL标头,不要包含<wincrypt.h>#define WIN32_LEAN_AND_MEAN,以避免通过其他Windows标头包含它。