首页 > 解决方案 > Graphviz 使用 Makefile 未定义对“_imp__agread”的引用

问题描述

我是一名学生,试图在我的 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。

除了调用这两个函数的非常简单的 main 函数(在另一个文件中),这是我的 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

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

标签: makefilelinkergraphvizundefined-referencelib

解决方案


推荐阅读