Ger*_*ima 2 c static-libraries library-design static-linking
虽然我不是C语言的经验丰富的程序员,但我必须在工作中使用这种语言来构建一个静态库,它可以在SunOS和Win32上编译.这个库只有几个源文件及其相应的头文件(让我们说:a.c
,b.c
,a.h
和b.h
).项目在两个平台中编译,并mylib.a
生成库.
我的问题是如何将实现的函数暴露mylib.a
给其他项目,因为当我添加两者时a.h
,b.h
我得到一些宏重定义错误.
编辑:我发现宏重新定义错误是因为编译命令中的宏定义(与我的标题无关)并且它已经解决了:)但我仍然希望组织我的源文件和头文件.
我怀疑的是我是否修改a.h
并b.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)
您应该有一个公共标题,mylib.h
它只包含库用户需要知道的定义.
然后,您有一个私有标题,mylib-internal.h
在项目中使用.你不应该试着保持两个"同步",而是要mylib-internal.h
包含#include "mylib.h"
.
您还应该命名所有的接口函数mylib_initialize()
等,并确保声明static
或命名所有私有内部函数_mylib_internal_whatever()
,以便用户不会与其他库进行命名空间冲突.