如何编译Discount C-library?

时间:2012-04-07 10:45:40

标签: c markdown discount

我想使用Discount C库将Markdown文本转换为HTML。我已经成功编译并安装了库(版本2.1.3)。

我尝试编译此代码

#include <mkdio.h>
int main(void)
{
 FILE *in, *out;
 MMIOT *doc;

 in = fopen("sample.md", "r");
 out = fopen("out.html", "w");

 doc = mdk_in(in, 0);
 markdown(doc, out, 0);

 ...
}

解释mkd_in()将输入文件in读入库工作类型MMIOT doc,markdown()应将doc转换为HTML并写入out文件。

使用命令gcc -Wall -lmarkdown -o FILE FILE.c,我总是得到以下输出:

undefined reference to `mkd_in(_IO_FILE*, unsigned int)'
undefined reference to `markdown(void*, _IO_FILE*, unsigned int)'

注意:我使用--shared选项运行Discount的配置工具来构建动态库。默认是一个静态库但是我遇到了同样的问题。

1 个答案:

答案 0 :(得分:2)

请改为尝试:

gcc -Wall -o FILE FILE.c -lmarkdown

-l的位置非常重要,因为许多链接器只会在解析-l时存在时使用库来满足未解析的引用。这可以例如,导致循环依赖的各种问题。

您最初拥有它时,由于尚未编译FILE.c,因此这些功能尚未解决。当您执行编译FILE.c时,该点之后没有-l来满足引用。

来自gcc手册页:

  

当您使用同一类型的多个选项时,订单确实很重要;例如,如果多次指定-L,则按指定的顺序搜索目录。此外,-l选项的位置非常重要。

稍后,在-l下:

  

在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,foo.o -lz bar.o在文件foo.o之后但在bar.o之前搜索库z。如果bar.o引用z中的函数,则可能无法加载这些函数。