我在库初学者链接,并花了两天时间试图将libcrypto
库上的Visual Studio 2017年链接到我的C程序。
我不得不包括applink.c
来解决我的问题。但我认为这是非常奇怪的包括东西这不是一个头。在网上搜索了一下之后,我了解到包括一个源文件是存在的,但应该避免这样做。为什么然后openssl library
不?C:包括源文件,而不是头
我不认为它是特别相关的,但这里是这个源文件的小概述,你可以找到整个源文件here。
#define APPLINK_OPEN 18 /* formally can't be used, as flags can vary */
#define APPLINK_READ 19
#define APPLINK_WRITE 20
#define APPLINK_LSEEK 21
#define APPLINK_CLOSE 22
#define APPLINK_MAX 22 /* always same as last macro */
#ifndef APPMACROS_ONLY
# include <stdio.h>
# include <io.h>
# include <fcntl.h>
static void *app_stdin(void)
{
return stdin;
}
static void *app_stdout(void)
{
return stdout;
}
if (once) {
OPENSSL_ApplinkTable[APPLINK_STDIN] = app_stdin;
OPENSSL_ApplinkTable[APPLINK_STDOUT] = app_stdout;
OPENSSL_ApplinkTable[APPLINK_STDERR] = app_stderr;
OPENSSL_ApplinkTable[APPLINK_FPRINTF] = fprintf;
OPENSSL_ApplinkTable[APPLINK_FGETS] = fgets;
OPENSSL_ApplinkTable[APPLINK_FREAD] = fread;
OPENSSL_ApplinkTable[APPLINK_FWRITE] = fwrite;
OPENSSL_ApplinkTable[APPLINK_FSETMOD] = app_fsetmod;
OPENSSL_ApplinkTable[APPLINK_FEOF] = app_feof;
OPENSSL_ApplinkTable[APPLINK_FCLOSE] = fclose;
OPENSSL_ApplinkTable[APPLINK_FOPEN] = fopen;
OPENSSL_ApplinkTable[APPLINK_FSEEK] = fseek;
OPENSSL_ApplinkTable[APPLINK_FTELL] = ftell;
OPENSSL_ApplinkTable[APPLINK_FFLUSH] = fflush;
OPENSSL_ApplinkTable[APPLINK_FERROR] = app_ferror;
OPENSSL_ApplinkTable[APPLINK_CLEARERR] = app_clearerr;
OPENSSL_ApplinkTable[APPLINK_FILENO] = app_fileno;
OPENSSL_ApplinkTable[APPLINK_OPEN] = _open;
OPENSSL_ApplinkTable[APPLINK_READ] = _read;
OPENSSL_ApplinkTable[APPLINK_WRITE] = _write;
OPENSSL_ApplinkTable[APPLINK_LSEEK] = _lseek;
OPENSSL_ApplinkTable[APPLINK_CLOSE] = _close;
once = 0;
}
包含头文件和源文件有什么区别?有什么缺点和优点呢?
这个职位不是要求的方式来解决链路问题
那么,openssl不是我们所说的“编程良好的库”...... – Stargateur
[您只能定义一个函数](http://en.cppreference.com/w/cpp/language/definition) (除少数例外)。如果你要包含一个源文件,你可以在每个包含它的文件中定义每个函数*。如果您只包含一次文件(如果只将其包含在另一个源文件中),则可以避开它。您的问题很可能是您没有编译该指定的源文件,或者没有与其链接。由于您使用的是Visual Studio,因此您应该将其作为源文件简单地添加到项目中。 –
@FrançoisAndrieux这是错误的,除非他从头文件中包含applink.c文件。请注意这里的'static'关键字。 –