提问人:Student 提问时间:9/28/2021 最后编辑:Student 更新时间:9/28/2021 访问量:186
使用 Makefile 对“_imp__agread”的 Graphviz 未定义引用
Graphviz undefined reference to `_imp__agread' using Makefile
问:
我是一名学生,试图在我的 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
似乎找到了头文件,只是没有定义任何函数。我能做些什么来解决这个问题并编译项目?我是初学者,非常感谢任何帮助!:)
答: 暂无答案
评论
gvc