我用C语言编写的库的最佳实践

时间:2014-09-13 18:37:07

标签: c linux gcc libraries

这很尴尬,但直到现在我总是将* .h和* .c文件复制到我的projekts位置。这是一团糟,我想改变它!

我想建立自己的c库,并对此有一些疑问。

我应该在哪里找到* .h文件?
我应该在全局/ usr / include /文件夹中复制它们,还是应该在$ HOME(或其他任何地方)创建我自己的文件夹? 我应该在哪里找到* .a文件和* .o文件以及* .c文件。

我正在使用debian和gcc。我的c项目在$ HOME / dev / c /.

我会将我的lib-sources保存在$ HOME / dev / c / lib中(如果这是你推荐的方式)并将* .o,* .a和* .h文件复制到我要求的位置对

如何将lib-location引入编译器?我应该将它添加到$ PATH,还是应该在我的projekt的makefile中引入它(比如-L PATH / TO / LIBRARY -l LIBRARY)。

您是否还有建立自己的图书馆的进一步提示和技巧?

2 个答案:

答案 0 :(得分:5)

我建议将文件放在$HOME目录中的某个位置。我们假设您已创建了一个名为linluk的库,并希望将该库保留在$HOME/dev/c/linluk下。那将是你的项目根目录。

您需要一个合理的目录结构。我的建议是有一个包含你的库的lib目录和一个包含头文件的include目录。

$PROJECT_ROOT/
    lib/
        liblinluk.so
    include/
        linluk.h
    src/
        linluk.c
    Makefile

正在编译:如果要在其他项目中使用此库,则需要将-I$PROJECT_ROOT/include添加到编译行,以便您可以编写#include <linluk.h>源文件。

链接:您可以将-L$PROJECT_ROOT/lib -llinluk添加到链接器命令行,以便在链接时提取已编译的库。确保您的.so文件具有lib前缀:它应该是liblinluk.so,而不是linluk.so

src目录和Makefile是可选的。库的用户不需要源代码,但如果有人想重新制作.so文件,可能会有帮助。

答案 1 :(得分:2)

正如我评论的那样,您应该首先尝试从其源代码构建和安装几个免费软件库,例如:例如liboniongdbmGNU readline等(不要使用任何分发包,而是从源代码编译和安装这些包)。这将教你一些好的做法。

您可能希望安装这些系统范围的库,而不是您的特定用户。然后,假设您的库被称为foo(您需要给它一些名字!),

  • 标题文件*.h进入/usr/local/include/foo/

  • 共享对象(动态库)进入/usr/local/lib/libfoo.so(可能有一些版本编号)

  • 如果相关,静态库会进入/usr/local/lib/libfoo.a

您需要将/usr/local/lib/添加到/etc/ld.so.conf并运行ldconfig(8)

并且您不想复制任何源文件*.c或目标文件*.o

阅读Program Library HowTo(后来,Drepper的论文:How To Write Shared Libraries

您可以考虑让pkg-config知道您的图书馆。然后在foo.pc

下安装一些/usr/local/lib/pkgconfig/

顺便说一句,我强烈建议您将您的图书馆发布为free software,可能在github或其他地方。您将获得有用的反馈,并可以获得一些帮助以及一些错误报告或增强功能。

您可能应该使用make之类的构建器,并在install中设置Makefile目标(提示:使其使用DESTDIR约定。)