繁体   English   中英

C中的共享库

[英]shared library in C

我在C中创建一个共享库,但不知道源代码的正确实现是什么。

我想创建一个API,比如printHello,

int printHello( char * text );

这个printHello函数将调用另一个函数:

在源文件libprinthello.c中,

void printHello( char * text )
{
   printHi();
   printf("%s", text);
}

由于此printHello函数是用户或应用程序的接口:

在头文件libprinthello.h中,

extern void printHello( char * text);

然后在printHi函数的源文件中,使用printhi.c

void printHi()
{
   printf("Hi\n");
}

那我的问题是,因为printHello是我想在用户中公开的唯一函数,我应该在printHi函数中做什么实现?

我还应该extern printHi函数的声明吗?

您可以使用两个单独的头文件:

libprinthello.h

#ifndef LIBPRINTHELLO_H /* These are include guards */
#define LIBPRINTHELLO_H

void printHello(char * text); 

#endif

libprinthi.h

#ifndef LIBPRINTHI_H
#define LIBPRINTHI_H

void printHi();

#endif

libprinthello.c

#include "libprinthi.h"
#include "libprinthello.h"

void printHello(char * text)  
{  
    printHi();  
    printf("%s", text);  
}  

libprinthi.c

#include "libprinthi.h"

void printHi()    
{    
    printf("Hi\n");    
}    

然后用户代码只包含libprinthello.h ,并且你保持libprinthi.h远离用户,使得printHi()对它们不可见(用户代码也会链接到共享库):

#include "libprinthello.h"

int main()
{
    printHello("Hello World!\n");
    return 0;
}

如果将printHi的定义放在libprinthello.c中,则可以简单地将其声明为静态,并且只能在同一文件中定义的其他函数中访问它。 如果要将定义放在自己的翻译单元中,则没有可移植的方法使其对库的用户隐藏,但您可以以特定于实现的方式隐藏它。 例如,使用gcc,您可以使用__attribute __((visibility(“hidden”)))。 但是,只需将声明保留在公共头文件之外就足以使库的用户不能使用该函数。

理想情况下,如果您不希望用户调用printHi()函数,则它们不应该是可见的。 如果这不可行,请使用约定来指示用户要调用哪些名称,哪些不是。 传统上,这是使用前导下划线完成的,但这可能会导致各种冲突。 因此,如果您有库的命名约定,则可以将pfx_GlobalName()用于记录的,用户可调用的函数,将pfxInternalName()用于未记录的函数,或者反过来,或者使用一些类似的约定。 然后,您可以简单地告诉用户不支持对未记录的函数的直接调用,并且在将来的版本中可能会破坏它们的任何使用(或者可以重命名该函数或其他任何内容)。 并偶尔进行更改,以明确表达您所说的内容。

因此,如果隐藏函数可以与记录的公共函数放在同一个源模块中,请隐藏它们。 如果不能,请使用命名约定来指示隐藏的函数不是供最终用户使用。

您可以使用GCC控制符号映射和符号的符号的可见性; 尽管如此,它还是很繁琐。

考虑这个文件(Export_Macro.h)

#ifndef EXPORT_MACRO_H
#define EXPORT_MACRO_H

#ifdef _WINDOWS
    #ifdef I_WANT_TO_EXPORT_MACROS
        #define EXPORT_MACRO __declspec(dllexport)
    #else
        #define EXPORT_MACRO __declspec(dllimport)
    #endif
#else
    #define EXPORT_MACRO
#endif

#endif // EXPORT_MACRO_H

在您的源代码中执行以下操作:

#include "Export_Macro.h"
...
// for functions you want to export outside the DLL (Dynamic Link Library)/so (Shared Object)
EXPORT_MACRO void printHello( char * text);

这对我很有用。

您可以在此处找到更完整的解释和导出宏。

稍后编辑:这应该在Unix和Windows中运行,没有任何大问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM