1

我是 Linux 编程的新手(Linux 3.7.10)。我试图编译我为 github 获得的程序,但遇到了错误问题。主程序来自我下载 ndpi ( https://svn.ntop.org/svn/ntop/trunk/nDPI/ ) 的 ntop 并且编译正常。第二部分是我从 github ( https://github.com/ewildgoose/ndpi-netfilter ) 获得的内核模式过滤器。

首先,我找不到在任何头文件中声明的 strtok_r 函数。我搜索了整个系统,它是系统中的预构建功能吗?请任何指针将不胜感激。谢谢。

CC [M]  /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.o
/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c: In function     'check_content_type_and_change_protocol':

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:610:4: error: implicit declaration of function 'strtok_r' [-Werror=implicit-function-declaration]

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:610:10: warning: assignment makes pointer from integer without a cast [enabled by default]

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:617:14: warning: assignment makes pointer from integer without a cast [enabled by default]

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:623:9: warning: assignment makes pointer from integer without a cast [enabled by default]

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:627:11: warning: assignment makes pointer from integer without a cast [enabled by default]

/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:632:13: warning: assignment makes pointer from integer without a cast [enabled by default]

cc1: some warnings being treated as errors

make[2]: *** [/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.o] Error 1

make[1]: *** [_module_/home/mtot/ndpi/ndpi-netfilter/src] Error 2

添加更多细节

我在 /usr/include 中找到了包含 strtok_r 的 string.h。我所做的是在 http.c 文件中添加 -I/usr/include 在 Makefile 中的 ccflags-y 中。我收到以下错误。真的需要帮助。谢谢。

CC [M]  /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.o
  In file included from include/linux/compiler.h:48:0,
                 from include/uapi/linux/stddef.h:1,
  `enter code here`               from include/linux/stddef.h:4,
                 from /usr/src/linux-3.7.10/include/uapi/linux/posix_types.h:4,
                 from include/uapi/linux/types.h:13,
                 from include/linux/types.h:5,
                 from include/uapi/linux/byteorder/little_endian.h:11,
                 from include/linux/byteorder/little_endian.h:4,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/byteorder.h:4,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_main.h:49,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_protocols.h:29,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:25:
include/linux/compiler-gcc.h:93:0: warning: "__attribute_const__" redefined [enabled by default]
In file included from /usr/include/features.h:375:0,
                 from /usr/include/string.h:25,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:24:
/usr/include/sys/cdefs.h:237:0: note: this is the location of the previous definition
In file included from include/linux/compiler.h:48:0,
                 from include/uapi/linux/stddef.h:1,
                 from include/linux/stddef.h:4,
                 from /usr/src/linux-3.7.10/include/uapi/linux/posix_types.h:4,
                 from include/uapi/linux/types.h:13,
                 from include/linux/types.h:5,
                 from include/uapi/linux/byteorder/little_endian.h:11,
                 from include/linux/byteorder/little_endian.h:4,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/byteorder.h:4,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_main.h:49,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_protocols.h:29,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:25:
include/linux/compiler-gcc.h:112:0: warning: "__always_inline" redefined [enabled by default]
In file included from /usr/include/features.h:375:0,
                 from /usr/include/string.h:25,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:24:
/usr/include/sys/cdefs.h:308:0: note: this is the location of the previous definition
In file included from include/linux/bitops.h:22:0,
                 from include/linux/kernel.h:10,
                 from include/linux/skbuff.h:17,
                 from include/linux/ip.h:20,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_main.h:105,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_protocols.h:29,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:25:
/usr/src/linux-3.7.10/arch/x86/include/asm/bitops.h:406:19: error: static declaration of 'ffs' follows non-static declaration
In file included from /usr/src/linux-3.7.10/arch/x86/include/asm/string.h:4:0,
                 from include/linux/string.h:17,
                 from include/linux/bitmap.h:8,
                 from include/linux/cpumask.h:11,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/cpumask.h:4,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/msr.h:18,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/processor.h:20,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/thread_info.h:22,
                 from include/linux/thread_info.h:54,
                 from include/linux/preempt.h:9,
                 from include/linux/spinlock.h:50,
                 from include/linux/mm_types.h:8,
                 from include/linux/kmemcheck.h:4,
                 from include/linux/skbuff.h:18,
                 from include/linux/ip.h:20,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_main.h:105,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_protocols.h:29,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:25:
/usr/src/linux-3.7.10/arch/x86/include/asm/string_64.h:64:5: error: expected identifier or '(' before '__extension__'
/usr/src/linux-3.7.10/arch/x86/include/asm/string_64.h:64:5: error: expected identifier or '(' before ')' token
In file included from include/linux/bitmap.h:8:0,
                 from include/linux/cpumask.h:11,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/cpumask.h:4,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/msr.h:18,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/processor.h:20,
                 from /usr/src/linux-3.7.10/arch/x86/include/asm/thread_info.h:22,
                 from include/linux/thread_info.h:54,
                 from include/linux/preempt.h:9,
                 from include/linux/spinlock.h:50,
                 from include/linux/mm_types.h:8,
                 from include/linux/kmemcheck.h:4,
                 from include/linux/skbuff.h:18,
                 from include/linux/ip.h:20,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_main.h:105,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/include/ndpi_protocols.h:29,
                 from /home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.c:25:
include/linux/string.h:38:12: error: expected identifier or '(' before '__extension__'
include/linux/string.h:38:12: error: expected identifier or '(' before ')' token
include/linux/string.h:41:12: error: expected identifier or '(' before '__extension__'
include/linux/string.h:53:15: error: expected identifier or '(' before '__extension__'
include/linux/string.h:83:15: error: expected identifier or '(' before '__extension__'
include/linux/string.h:83:15: error: expected identifier or '(' before ')' token
include/linux/string.h:86:15: error: expected identifier or '(' before '__extension__'
include/linux/string.h:86:15: error: expected identifier or '(' before ')' token
include/linux/string.h:89:24: error: expected identifier or '(' before '__extension__'
include/linux/string.h:89:24: error: expected identifier or '(' before ')' token
include/linux/string.h:92:24: error: expected identifier or '(' before '__extension__'
include/linux/string.h:92:24: error: expected identifier or '(' before ')' token
make[2]: *** [/home/mtot/ndpi/ndpi-netfilter/src/ndpi_cpy/lib/protocols/http.o] Error 1
make[1]: *** [_module_/home/mtot/ndpi/ndpi-netfilter/src] Error 2
make[1]: Leaving directory `/usr/src/linux-3.7.10'
make: *** [all] Error 2

-----制作文件

NDPI_PATH2 := ${NDPI_PATH}/src
NDPI_SRC := ndpi_cpy
NDPI_PRO := ${NDPI_SRC}/lib/protocols
NDPI_THIRD := $(NDPI_SRC)/lib/third_party/src
SYS_HDR := /usr/include

ccflags-y += -I${src}/${NDPI_SRC}/include -I${src}/${NDPI_SRC}/lib -I${src}/${NDPI_SRC}/lib/third_party/include -I${SYS_HDR} -DOPENDPI_NETFILTER_MODULE


EXTRA_CFLAGS := $(ccflags-y)

#MODULES_DIR := /lib/modules/$(shell uname -r)
#KERNEL_DIR := ${MODULES_DIR}/build

obj-m := xt_ndpi.o
xt_ndpi-y := main.o \
                ${NDPI_SRC}/lib/ndpi_main.o \
                ${NDPI_THIRD}/ahocorasick.o \
                ${NDPI_THIRD}/node.o \
                ${NDPI_THIRD}/sort.o \
                ${NDPI_PRO}/afp.o \
                ${NDPI_PRO}/http.o 


all:
        if test -d ${NDPI_SRC}; then \
                cp ${NDPI_PATH2}/* ${NDPI_SRC} -R; \
        else \
                mkdir ${NDPI_SRC}; \
                cp ${NDPI_PATH2}/* ${NDPI_SRC} -R; \
        fi
        make -C ${KERNEL_DIR} M=$$PWD;
        rm -r ${NDPI_SRC}
modules:
        make -C ${KERNEL_DIR} M=$$PWD $@;
modules_install:
        make -C ${KERNEL_DIR} M=$$PWD $@;
        depmod -a;
clean:
        make -C ${KERNEL_DIR} M=$$PWD $@;
4

2 回答 2

2

strtok_r通常在string.h. 在安装了手册页的 Linux 系统上,您可以执行

man strtok_r

这将给出手册页:

STRTOK(3)                  Linux Programmer’s Manual                 STRTOK(3)

NAME
   strtok, strtok_r - extract tokens from strings

SYNOPSIS
   #include <string.h>

   char *strtok(char *str, const char *delim);

   char *strtok_r(char *str, const char *delim, char **saveptr);
...

include行告诉您它在哪个文件中(并且必须包含在使用它的代码中)。你检查过string.h你的系统上是否有吗?它通常在/usr/include.

很多发行版都有开发包,你是否安装了这些包以获得完整的开发环境?

于 2013-10-15T18:55:54.730 回答
0

类型

man strtok_r

在一个终端。您应该获得类似strtok_r(3)的手册页(请点击该链接)。

确保已安装适当的开发和文档包,如libc6-dev(或libc-devglibc-doc、、manpages-dev. (实际名称取决于分布)。

于 2013-10-15T18:55:50.183 回答