使用 Makefile 对“_imp__agread”的 Graphviz 未定义引用

Graphviz undefined reference to `_imp__agread' using Makefile

提问人:Student 提问时间:9/28/2021 最后编辑:Student 更新时间:9/28/2021 访问量:186

问:

我是一名学生,试图在我的 C 项目中使用 Graphviz 作为外部库,使用 Windows。但是,当我尝试编译它时,我收到了对“gvc.h”和“cgraph.h”中包含的函数的未定义引用错误。例如,agread 和 gvContext。

我浏览了许多关于同一主题的帖子,但似乎没有任何建议对我有用。

目前,我只在处理 Makefile 的 Windows 部分。这是完整的:

.PHONY: all clean
#CFLAGS = `pkg-config --cflags glib-2.0`
#LDLIBS = `pkg-config --libs glib-2.0`
CFLAGS = -I"C:/Program Files/Graphviz/include/graphviz"
LDIR = -L"C:/Program Files/Graphviz/lib"
LIBS = -lgvc -lcgraph

binaries=sqlpsql
all: $(binaries)

sqlpsql: SQLP.c SQLPGrammar.y SQLPScanner.l SQLPtoSQL-main.c Preprocess.c Rules.c
   
ifeq ($(OS),Windows_NT)
   win_bison -v -d SQLPGrammar.y
   win_flex --nounput -D SQLPGrammar SQLPScanner.l
   gcc -Wall -o sqlpsql SQLP.c SQLPtoSQL-main.c Preprocess.c Rules.c $(CFLAGS) $(LDIR) $(LIBS)
else
   bison -v -d SQLPGrammar.y
   flex --nounput -D SQLPGrammar SQLPScanner.l
   gcc -Wall SQLP.c SQLPtoSQL-main.c Preprocess.c Rules.c -o sqlpsql
   rm -f lex.yy.c SQLPGrammar.tab.c SQLPGrammar.tab.h
endif

clean:
   -rm -f *.o *.output $(binaries)

在我的计算机上,头文件位于:C:/Program Files/Graphviz/include/graphviz

lib 文件位于:C:/Program Files/Graphviz/lib

如上所述,我已使用 -I 和 -L 标签将这两个位置添加到 Makefile 中。

除了调用这两个函数的非常简单的主函数(在另一个文件中)外,这里是我的 SQLP.c 文件:

#include <stdio.h>
#include <gvc.h>
#include <cgraph.h>
#include "SQLP.h"

void generate_graph(){
    FILE *fp;
    fp = fopen("C:/Users/claud/Documents/UW/4A/Roseseed/test.dot", "w+");
    fputs("digraph ERD {\n", fp);
    fputs("graph [   rankdir = \"LR\" ];\n", fp);
    fputs("ranksep=2;\n", fp);
    fputs("\"SCOTT.DEPT\" [ label=\"<SCOTT.DEPT> SCOTT.DEPT|<PK_DEPT>DEPTNO \\l |DNAME \\l LOC \\l \" shape = \"record\" ];\n", fp);
    fputs("\"SCOTT.EMP\" [ label=\"<SCOTT.EMP> SCOTT.EMP|<FK_DEPTNO>DEPTNO \\l |EMPNO \\l ENAME \\l JOB \\l MGR \\l STARTDATE \\l SAL \\l COMM \\l \" shape = \"record\" ];\n", fp);
    fputs("\"SCOTT.DEPT\":\"PK_DEPT\"->\"SCOTT.EMP\":\"FK_DEPTNO\" [arrowhead = crow];}\n", fp);
    fclose(fp);

    export_graph();    
}

void export_graph(){
    FILE *fp;
    fp = fopen("C:/Users/claud/Documents/UW/4A/Roseseed/test.dot", "r");
    Agraph_t *g;
    g = agread(fp, 0);
    GVC_t *gvc;
    gvc = gvContext();
    gvLayout(gvc, g, "dot");
    gvRender(gvc, g, "png", 
        fopen("C:/Users/claud/Documents/UW/4A/Roseseed/test.png", "w"));
    gvFreeLayout(gvc, g);
    agclose(g);
}

所有其他文件都可以正确编译,因为它们不包含这些头文件。

这是在 Makefile 位置的 Git Bash 上运行 make 的完整输出:

$ make
win_bison -v -d SQLPGrammar.y
win_flex --nounput -D SQLPGrammar SQLPScanner.l
gcc -Wall -o sqlpsql SQLP.c SQLPtoSQL-main.c Preprocess.c Rules.c -I"C:/Program Files/Graphviz/include/graphviz" -L"C:/Program Files/Graphviz/lib" -lgvc -lcgraph
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3abe): undefined reference to `_imp__agread'
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3ac8): undefined reference to `_imp__gvContext'
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3ae7): undefined reference to `_imp__gvLayout'
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3b1b): undefined reference to `_imp__gvRender'
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3b2f): undefined reference to `_imp__gvFreeLayout'
C:\Users\claud\AppData\Local\Temp\ccEwgb5N.o:SQLP.c:(.text+0x3b3c): undefined reference to `_imp__agclose'
collect2.exe: error: ld returned 1 exit status
make: *** [Makefile:13: sqlpsql] Error 1

似乎找到了头文件,只是没有定义任何函数。我能做些什么来解决这个问题并编译项目?我是初学者,非常感谢任何帮助!:)

makefile 链接器 graphviz undefined-reference lib

评论

0赞 MadScientist 9/28/2021
请编辑您的问题,并(使用正确的格式,就像您对 makefile 所做的那样)剪切并粘贴(而不是释义)确切的编译器命令行打印出来,以及(如果太多,则采样)您得到的确切错误消息。我对 Windows 或 Graphviz 了解不多,但到目前为止,这看起来并没有错。也许还有其他库,除此之外,你需要链接吗?gvc
0赞 Student 9/28/2021
@MadScientist感谢您的建议!我编辑了我的帖子,以包含我收到的确切错误消息。
0赞 Student 9/28/2021
我试图包含 gvc.h 包含的库 cgraph,但这也没有帮助(编辑 Makefile 以显示这一点)。我认为没有必要将每个库都包含在 Makefile 中,但我还是尝试了一下,但仍然不起作用......
0赞 Student 9/28/2021
更新 - 我确实找到了这个链接: graphviz.org/dot.demo/Makefile 它具有以下两行: CFLAGS=pkg-config libgvc --cflags -Wall -g -O2 LDFLAGS=pkg-config libgvc --libs 可能需要哪些?但是当我包含它们时,我得到 /usr/bin/sh: pkg-config: command not found
0赞 MadScientist 9/28/2021
这些行只适用于像 GNU/Linux 这样的 POSIX 系统。它们不适用于 Windows。在 Linux 上,它们将打印出编译和链接所需的正确标志,以便将它们包含在命令行中。在 Windows 上,我想你必须自己弄清楚。也许看看文档。对不起,我无能为力:您需要了解 Windows 上 Graphviz 的人。如果没有人在这里插话,也许有一些 Graphviz 的帮助论坛。

答: 暂无答案