makefile - 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
似乎找到了头文件,只是没有定义任何函数。我能做些什么来解决这个问题并编译项目?我是初学者,非常感谢任何帮助!:)
解决方案
推荐阅读
- google-sheets - 用于创建图像路径的 Google 表格 SUBSTITUTE 公式
- for-loop - 用于可重复动作javasript的循环?
- android - Google Play 服务登录内部错误 (Xamarin)
- angular - 我试图用 2 个不同单位的变量在 Angular NgStyle 上计算我的 div 宽度
- reactjs - 如何从 React TextField Select 中删除箭头
- java - 无法将旧版 Spring Web 应用程序连接到 Okta
- google-api-python-client - 如何通过 Landsatxplore 包从 USGS 并行下载批量数据?
- python - 在 numpy 中矢量化 VLAD 计算
- python-3.x - 我正在使用随机森林(python)为我的糖尿病预测项目实现这个,请帮助我处理这段代码。它显示了一些错误
- pdp - 特征名称不匹配错误“f0”、“f1”、“f2”、“f3”