【问题标题】:How to compile Discount C-library?如何编译折扣 C 库?
【发布时间】:2012-04-07 10:45:39
【问题描述】:

我想使用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 配置工具来构建动态库。默认是静态库,但我遇到了同样的问题。

【问题讨论】:

    标签: c markdown discount


    【解决方案1】:

    试试这个:

    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 中的函数,则可能不会加载这些函数。

    【讨论】:

    • 我的问题与原始海报完全相同,但您的回答没有帮助 - 知道为什么吗?我要疯了!
    • @Vittorio,如果是 exact 相同的问题,答案将有效。最好的办法是询问另一个包含完整细节的问题,特别是那些不同的问题,否则它将作为副本关闭。通过提出问题,您可以获得 SO 的全部资源来调查您的问题,而不仅仅是我 :-)
    • 我修好了!在头文件中添加了extern "C"
    猜你喜欢
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多