![错误:函数“rt_dev_socket”的隐式声明](https://linux22.com/image/48598/%E9%94%99%E8%AF%AF%EF%BC%9A%E5%87%BD%E6%95%B0%E2%80%9Crt_dev_socket%E2%80%9D%E7%9A%84%E9%9A%90%E5%BC%8F%E5%A3%B0%E6%98%8E.png)
开发商说:http://comments.gmane.org/gmane.linux.real-time.rtnet.user/2546
现在我如何告诉 Makefile 分别在 /usr/local/rtnet/include 中查找标头 我如何设置我的 CFLAGS?
EXTRA_CFLAGS := -I ...
抱歉,这个问题并不是真正依赖于 RTnet,但我找不到涵盖此问题的 Makefile-howto。
也许这会有所帮助,尽管由于服务于 2.4 和 2.6 内核,它有点复杂:
所以,我从这里获取了 makefile:http://svn.gna.org/viewcvs/xenomai/trunk/examples/rtdm/driver-api/
并添加-I /usr/local/rtnet/include
对应于 **EXTRA_CFLAGS**
###### CONFIGURATION ######
### List of applications to be build
APPLICATIONS = hello
### Note: to override the search path for the xeno-config script, use "make XENO=..."
### List of modules to be build
MODULES = hello
### Note: to override the kernel source path, use "make KSRC=..."
###### USER SPACE BUILD (no change required normally) ######
ifeq ($(KERNELRELEASE),)
ifneq ($(APPLICATIONS),)
### Default Xenomai installation path
XENO ?= /usr/xenomai
XENOCONFIG=$(shell PATH=$(XENO):$(XENO)/bin:$(PATH) which xeno-config 2>/dev/null)
### Sanity check
ifeq ($(XENOCONFIG),)
all::
@echo ">>> Invoke make like this: \"make XENO=/path/to/xeno-config\" <<<"
@echo
endif
CC=$(shell $(XENOCONFIG) --cc)
CFLAGS=$(shell $(XENOCONFIG) --skin=native --cflags) $(MY_CFLAGS)
LDFLAGS=$(shell $(XENOCONFIG) --xeno-ldflags) $(MY_LDFLAGS) -lnative -lrtdm
# This includes the library path of given Xenomai into the binary to make live
# easier for beginners if Xenomai's libs are not in any default search path.
LDFLAGS+=-Xlinker -rpath -Xlinker $(shell $(XENOCONFIG) --libdir)
all:: $(APPLICATIONS)
clean::
$(RM) $(APPLICATIONS) *.o
endif
endif
###### KERNEL MODULE BUILD (no change required normally) ######
ifneq ($(MODULES),)
### Default to sources of currently running kernel
KSRC ?= /lib/modules/$(shell uname -r)/build
OBJS := ${patsubst %, %.o, $(MODULES)}
CLEANMOD := ${patsubst %, .%*, $(MODULES)}
PWD := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
### Kernel 2.6
ifeq ($(findstring 2.6,$(KSRC)),2.6)
obj-m := $(OBJS)
EXTRA_CFLAGS := -I$(KSRC)/include/xenomai -I$(KSRC)/include/xenomai/posix $(ADD_CFLAGS) \
-I /usr/local/rtnet/include
all::
$(MAKE) -C $(KSRC) SUBDIRS=$(PWD) modules
### Kernel 2.4
else
ARCH ?= $(shell uname -i)
INCLUDE := -I$(KSRC)/include/xenomai -I$(KSRC)/include/xenomai/compat -I$(KSRC)/include/xenomai/posix
CFLAGS += $(shell $(MAKE) -s -C $(KSRC) CC=$(CC) ARCH=$(ARCH) SUBDIRS=$(PWD) modules) $(INCLUDE)
all:: $(OBJS)
endif
## Target for capturing 2.4 module CFLAGS
modules:
@echo "$(CFLAGS)"
clean::
$(RM) $(CLEANMOD) *.o *.ko *.mod.c Module*.symvers Module.markers modules.order
$(RM) -R .tmp*
endif
现在,当我执行 make 时,我收到错误:error: implicit declaration of function ‘rt_dev_socket’
对于以下hello.c
.
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>
#include <native/task.h>
#include <native/timer.h>
#include <rtdk.h>
RT_TASK demo_task;
void demo(void *arg)
{
RT_TASK *curtask;
RT_TASK_INFO curtaskinfo;
printf("Hello World!\n");
curtask=rt_task_self();
rt_task_inquire(curtask,&curtaskinfo);
printf("Task name : %s \n", curtaskinfo.name);
********int sockfd = rt_dev_socket(AF_INET, SOCK_DGRAM, 0);********
}
int main(int argc, char* argv[])
{
char str[10] ;
rt_print_auto_init(1);
mlockall(MCL_CURRENT|MCL_FUTURE);
printf("start task\n");
sprintf(str,"hello");
rt_task_create(&demo_task, str, 0, 50, 0);
rt_task_start(&demo_task, &demo, 0);
}