2013-10-15 2 views
1

Я новичок в программировании Linux (Linux 3.7.10). Я попытался скомпилировать программу, которую я получил для github, но запустил проблемы с ошибкой. Основная программа - от ntop, где я загрузил ndpi (https://svn.ntop.org/svn/ntop/trunk/nDPI/) и скомпилировал ok. Вторая часть - это фильтр режима ядра, который я получил от github (https://github.com/ewildgoose/ndpi-netfilter).ошибка: неявное объявление функции 'strtok_r'

Во-первых, я не смог найти функцию 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 

Добавление более подробной информации

Я расположена string.h, который имеет strtok_r в/USR/включать. Я сделал, чтобы добавить файл http.c, а также -I ​​/ usr/include в ccflags-y в Makefile. Я получил следующие ошибки. Помощь действительно нужна. Благодарю.

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 

----- MAKEFILE

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 [email protected]; 
modules_install: 
     make -C ${KERNEL_DIR} M=$$PWD [email protected]; 
     depmod -a; 
clean: 
     make -C ${KERNEL_DIR} M=$$PWD [email protected]; 
+1

Какой дистрибутив Linux вы используете? (3.7.10 - версия ядра, это не полезно). 'Strtok_r' не определяется стандартным C, хотя он определен POSIX. В моей системе 'man strtok_r' указывает, что вам нужно определить один из нескольких макросов теста функции, чтобы использовать его. –

+0

Я использую Suse 12.3 – AlbertK

+0

Возможный дубликат [Могу ли я использовать strtok() в модуле ядра Linux?] (Http://stackoverflow.com/questions/2246618/can-i-use-strtok-in-a-linux -kernel-module) –

ответ

0

Тип

man strtok_r 

в терминале. Вы должны получить справочную страницу, такую ​​как strtok_r(3) (пожалуйста, следуйте по этой ссылке).

Убедитесь, что установлены соответствующие разработки и документации пакетов, таких как libc6-dev (или libc-dev), glibc-doc, manpages-dev. (Фактическое имя зависит от распределения).

1

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.

У множества дистрибутивов есть пакеты разработки, были ли вы установлены такие пакеты, чтобы получить полноценную среду разработки?

+0

Хорошо. Я нашел string.h в/usr/include и он определил strtok_r, но Makefile компилирует его против ядра linux/include. Строка .h не содержит определения для strtok_r. Есть идеи? Благодарю. – AlbertK

+0

О, вы компилируете код ядра. Ядро - совершенно другая среда программирования, чем пространство пользователя. Вполне возможно, что 'strtok_r' просто недоступен. –

+0

Спасибо.Да, я пытаюсь скомпилировать загрузочный модуль ядра в рамках netfilter (iptables). В любом случае получить strtok_r, не нарушая при этом ядро. Еще раз спасибо. – AlbertK

Смежные вопросы