我是库链接的初学者,并花了两天时间尝试将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;
}
包含标头和源文件有什么区别?这样做的缺点和优点是什么?
这篇文章并没有要求解决链接问题的方法
答案 0 :(得分:-1)
包含文件就像将文件复制到C文件中一样。
这意味着包含C文件的任何内容都将在applink.c中拥有自己的各种函数副本。 您还会注意到它们已被声明为静态&#39;,这意味着这些副本是各自文件的本地副本,并且不会产生冲突。他们甚至可能被内联。
一般来说,这是二进制大小和编译时间之间的权衡,另一方面是运行时速度和代码简单性。
这不是一件罕见的事情,让我感到惊讶的是它的.c而不是.h。