我是库链接的初学者,我花了两天时间尝试将 libcrypto
库链接到我在 Visual Studio 2017 上的 C 程序.
我不得不包含 applink.c
来解决我的问题。但我认为包含不是标题的东西是很奇怪的。在互联网上搜索了一下之后,我了解到包含源文件是存在的,但应该避免这样做。为什么 openssl library
没有?
我不认为它特别相关,但这里是这个源文件的一个小概述,你可以找到整个源文件 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;
}
包含头文件和源文件有什么区别?这样做的优缺点是什么?
这篇文章并不是在寻求解决链接问题的方法
包含文件就像将文件复制到 C 文件中一样。
这意味着任何包含 C 文件的内容都将在 applink.c 中拥有自己的函数副本。您还会注意到它们被声明为“静态”,这意味着这些副本是它们各自文件的本地副本,并且不会产生冲突。它们甚至可能是内联的。
一般来说,一方面是二进制大小和编译时间,另一方面是运行时速度和代码简单性之间的权衡。
这不是什么稀罕事,更让我吃惊的是它是 .c 而不是 .h。
我是一名优秀的程序员,十分优秀!