【问题标题】:How do I create a library in C?如何在 C 中创建库?
【发布时间】:2020-06-20 21:47:56
【问题描述】:

我正在开发一个使用 libgit2 的程序。我将代码保存在单个 c 文件中。说:

somefile.c

我编译并使用它。现在我想将与libgit2相关的一些细节分离到项目内部的一个单独的库中。所以我创建了一个 h 文件,其中包含我需要的数据结构和我想要使用的函数的定义。到目前为止,没有什么特别的:初始化东西,传递到 repo 的路径和 sa treeish ......那些是 const * 常量......然后在库 c 文件中,我有一个 .h 文件中的函数的实现。

目前,布局是这样的:

include/mylib.c
include/mylib.h
somefile.c

include/mylib.h 我有一个结构和几个函数:

struct blah {} blah_info;

int blah_init(cont char * path, const char * treeish);

int blah_shutdown();

在 include/mylib.c 我包含 mylib.h:

#include "mylib.h" # notice that I don't have to use "include" in the path

然后我定义了放入 .h 文件中的 2 个函数。

somefile.c 中,现在我包含库 c 文件,而不是 .h 文件(也不再需要包含 git2.h,因为现在在 mylib 文件中已经完成了)。

#include "include/mylib.c"

这让我可以编译和运行程序,就像我将它分成几部分之前所做的那样但是我知道可以从原始 .c 文件中包含include/mylib.h。我认为它需要在编译最终程序之前构建库?需要哪些步骤?

现在我正在手动编译一个调用 GCC 的 shell 脚本......所以如果我需要运行更多命令来执行此操作,请告诉我,以便我将它们添加到脚本中。

【问题讨论】:

  • 如果你在#includeing 一个 C 文件,那就有问题了。
  • 这在技术上并不是不可能的,比如说......它正在工作......但我知道它不正确。这就是我提出这个问题的原因。
  • 即使它可以编译,你也不应该#include一个C文件。

标签: c linker shared-libraries


【解决方案1】:

somefile.c,你需要这样做:

#include "include/mylib.h"

并确保您在mylib.c定义这些函数:

int blah_init(cont char * path, const char * treeish) {

}

int blah_shutdown() {

}

然后在mylib.h声明他们:

struct blah {} blah_info;

int blah_init(cont char * path, const char * treeish);

int blah_shutdown();

编译时,将somefile.cmylib.c 作为输入文件。

【讨论】:

  • 我知道这是正确的方向,但它并不完整。如果我只这样做,我会收到 ld 的错误:somefile.c:(.text+0x119): undefined reference to blah_init'`。
  • @eftshift0 在C文件中定义,在H文件中声明
  • 检查,检查。
  • 编译时是否包含mylib.c 作为输入文件? gcc somefile.c mylib.c -o output
  • 哦,给你。所以我将它作为另一个参数添加到 gcc?让我试试看。
【解决方案2】:

#include 指令用于在其他地方插入文件的内容,它主要用于包含头文件,以便编译器知道什么是什么(类型、常量等),然后链接器将所有编译的文件放入一个可执行文件中。 为了确保标头只包含一次到单个文件中,您使用称为条件编译的东西,它是使用预处理器完成的(在编译之前)

你的lib.h

#ifndef YOUR_LIB_H_ //there are many naming conventions but I prefer this one
#define YOUR_LIB_H_

//all your declarations go here

#endif //YOUR_LIB_H_
//you should put in comment what's that condition for after every endif

现在在 yourlib.c 中包含该标头,然后编写定义

#include "yourlib.h"

//all your definitions go here

和你的主文件一样,只包含头文件,编译器知道该怎么做

#include "yourlib.h"

//your code goes here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多