2017-06-01 134 views
1

我在库初学者链接,并花了两天时间试图将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; 
} 

包含头文件和源文件有什么区别?有什么缺点和优点呢?

这个职位不是要求的方式来解决链路问题

+1

那么,openssl不是我们所说的“编程良好的库”...... – Stargateur

+1

[您只能定义一个函数](http://en.cppreference.com/w/cpp/language/definition) (除少数例外)。如果你要包含一个源文件,你可以在每个包含它的文件中定义每个函数*。如果您只包含一次文件(如果只将其包含在另一个源文件中),则可以避开它。您的问题很可能是您没有编译该指定的源文件,或者没有与其链接。由于您使用的是Visual Studio,因此您应该将其作为源文件简单地添加到项目中。 –

+0

@FrançoisAndrieux这是错误的,除非他从头文件中包含applink.c文件。请注意这里的'static'关键字。 –

回答

-1

包括文件就像将文件复制到你的C文件。

这意味着任何包含C文件的东西都会在applink.c中拥有自己的函数副本。 您还会注意到它们被声明为“静态”,这意味着这些副本对其各自的文件是本地的,并且不会产生冲突。他们甚至可能会被内联。

一般来说,这是一方面二进制大小和编译时间之间的折衷,另一方面是运行速度和代码简单性。

这不是一件罕见的事情要看,更令我惊讶的是它是.c而不是.h。

+0

通过拥有多个函数的静态副本,没有运行时速度的提高。代码简化优势也没有。 (只有'inline'有优势。) –

+0

少文件=简单,不是吗?至于速度,我认为基准是有序的。我的印象是速度更快,因为标题功能很可能被内联。 –

+0

山姆,我认为包括一个.c文件是不好的做法。包括定义'inline'函数的.h文件是可以的;这些不会导致通话开销。 –