这是一个愚蠢的编译错误,但是对于我一生来说,我无法找出问题所在。我已经花了几个小时,但一点都没有取得进展。而且我对OpenSSL的了解当然还不够,无法理解X509_NAME是什么。
我正在编译一个小的C文件,如果有人调用文件中的30个左右函数之一,则该函数的功能是打印出错误消息,以指示C程序不支持30个SSL函数。每个功能约3行长(请参见下文)。调用接口从openssl/X509.hwin32 的OpenSSL 文件复制而来。(我正在运行Windows10 x64,但使用VStudio 2017命令行设置为32位进行编译)。
这是openssl / x509.h包含文件中的原始接口:
int X509_NAME_get_text_by_NID(X509_NAME *name, int nid, char *buf, int len);
Run Code Online (Sandbox Code Playgroud)
由于原始的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);
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用VS 2017命令行编译器针对32位编译代码时,收到这些错误消息。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
Run Code Online (Sandbox Code Playgroud)
我在使用另一个更简单的函数时遇到了同样的错误(但是它也使用了X509_NAME宏)。它从第242行开始(请参阅上面的错误消息)。
X509_NAME *X509_get_subject_name(X509 *a) {
hio_oerror (E_NO_SSL_SUPPORT);
return (NULL);
}
Run Code Online (Sandbox Code Playgroud)
有谁知道如何解决这个问题?看起来很简单,但是对我来说却很难解决。我无法想象在这些行中如何在'('之前丢失')'。
编辑:我在stubssl.c中的包含文件:
#define WIN32_LEAN_AND_MEAN
#include "openssl/ssl.h"
#include "openssl/x509.h"
#include "openssl/bio.h"
#include "openssl/pem.h"
Run Code Online (Sandbox Code Playgroud)
在openSSL中,X509_NAME是一种类型,但<wincrypt.h>将其定义为值(((LPCSTR) 7))。不要自己定义它,而要使用openSSL头文件,不要包含它,<wincrypt.h>并#define WIN32_LEAN_AND_MEAN避免其他Windows头文件包含它。