如何在C中设计静态库的接口

Ger*_*ima 2 c static-libraries library-design static-linking

虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c,b.c,a.hb.h).项目在两个平台中编译,并mylib.a生成库.

我的问题是如何将实现的函数暴露mylib.a给其他项目,因为当我添加两者时a.h,b.h我得到一些宏重定义错误.

编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.

我怀疑的是我是否修改a.hb.h在外部使用,或者我是否应该专门创建一个头文件来声明这个库的接口(让我们说mylib.h).我不想过度复杂化原始标题,但我不想让同一个标题保持同步...我想听听更有经验的C程序员关于他们的模式,每种方法的优点以及是否还有其他方法选项.

先感谢您.

编辑:似乎我没有提供足够的信息; 下面的模式试图显示我的文件是如何组织的:每个代码文件只包含其标题,每个标题都有一个保护条件,每个标题包含一个公共标题,这个公共标题包括所有标题.

// a.c ----
#include "a.h"

// b.c ----
#include "b.h"

// a.h ----
#ifndef GUARD_A_H
#define GUARD_A_H
  # include "liball.h"
  void function_prototypes_implemented_in_a();
#endif // GUARD_A_H

// b.h ----
#ifndef GUARD_B_H
#define GUARD_B_H
  # include "liball.h"
  void function_prototypes_implemented_in_b();
#endif // GUARD_B_H

// liball.h ----
#ifndef GUARD_LIBALL_H
#define GUARD_LIBALL_H
  # include <time.h>   // standard headers
  # include <stdioa.h>

  # include "a.h"      // all headers in this project
  # include "b.h"
#endif // GUARD_LIBALL_H
Run Code Online (Sandbox Code Playgroud)

ams*_*ams 5

您应该有一个公共标题,mylib.h它只包含库用户需要知道的定义.

然后,您有一个私有标题,mylib-internal.h在项目中使用.你不应该试着保持两个"同步",而是要mylib-internal.h包含#include "mylib.h".

您还应该命名所有的接口函数mylib_initialize()等,并确保声明static或命名所有私有内部函数_mylib_internal_whatever(),以便用户不会与其他库进行命名空间冲突.