错误:函数'strtok_r'的隐式声明

时间:2013-10-15 18:46:24

标签: linux netfilter

我是Linux编程的新手(Linux 3.7.10)。我试图编译一个我为github获得的程序,但是遇到了错误的问题。主程序来自ntop,我下载了ndpi(https://svn.ntop.org/svn/ntop/trunk/nDPI/)并编译好了。第二部分是我从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文件中添加它,并在Makefile中的ccflags-y中添加-I / usr / include。我收到以下错误。帮助真的需要。感谢。

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 $@;

2 个答案:

答案 0 :(得分: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之下。

许多发行版都有开发包,你是否安装了这样的软件包以获得完全开发环境?

答案 1 :(得分:0)

输入

man strtok_r

在终端。你应该得到一个像strtok_r(3)这样的手册页(请点击该链接)。

请务必安装相应的开发和文档包,例如libc6-dev(或libc-dev),glibc-docmanpages-dev。 (实际名称取决于分布)。