我想使用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的配置工具来构建动态库。默认是一个静态库但是我遇到了同样的问题。
答案 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中的函数,则可能无法加载这些函数。