很久以前,我找到了libipfix,它是用C编写的IPFIX收集器。原始作者消失了,但是代码仍然可以在github上找到。我假设如果它在那儿,对其他人也有用。
当我尝试为特定子程序(example_collector_db)运行Makefile时,我收到来自GCC的“ expected expression before ...”消息,这对我来说没有太大意义。这是Makefile,尽管有很多删节:
CC = gcc
CCOPT = -Wall -g
INCLS = -I. -I.. -I../lib -I../libmisc
DEFS = -DHAVE_CONFIG_H
CFLAGS = $(CCOPT) $(INCLS) $(DEFS)
CPPFLAGS =
LDFLAGS =
LIBS = -L../lib -L../libmisc -lipfix -lmisc
example_collector_db: example_collector_db.o Makefile
$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ example_collector_db.o $(LDFLAGS) $(LIBS)
但是当我运行make时,会发生以下情况:
root@myLinux:/home/me/libipfix_110209/examples# make example_collector_db
gcc -Wall -g -I. -I.. -I../lib -I../libmisc -DHAVE_CONFIG_H -c example_collector_db.c
In file included from ../libmisc/misc.h:39:0,
from example_collector_db.c:54:
../libmisc/hashtable.h:6:1: error: expected expression before 'struct'
struct hashtable;
^
Makefile:72: recipe for target 'example_collector_db.o' failed
make: *** [example_collector_db.o] Error 1
root@myLinux:/home/me/libipfix_110209/examples#
嗯。看起来代码正在尝试使用“ hashtable.h”头文件。当我看一下时,会看到以下内容:
1 /* Copyright (C) 2002 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
2
3 #ifndef __HASHTABLE_CWC22_H__
4 #define __HASHTABLE_CWC22_H__
5
6 struct hashtable;
7
X ...more code here...
X
166 #endif /* __HASHTABLE_CWC22_H__ */
因此,GCC似乎在抱怨第6行,我认为这是代码中其他地方的有效结构的原型(?)或签名(?)。但是我不禁要问,海湾合作委员会是否真的在抱怨第四行……不应该#define语句有另一个标记,例如:
4 #define __HASHTABLE_CWC22_H__ 12345 // or something...?
乍一看,我很想假设第4行是问题所在,并且在添加第三个令牌之前,此代码无法工作。但是写这篇文章的程序员比我先进得多。如果代码有这么简单的错误,这个项目如何在github上生存将近十五年?
请原谅本文的“合理性检查”性质...我希望这里有一些更高级的东西,我的中级经验可以忽略...
谢谢!