嵌入式linux pthread_create() 出现segmentation fault。

2019-07-13 00:21发布

创建线程【pthread_create()】的时候出现了 segmentation fault。 错误语句如下: pthread_create(&dec_tid,NULL, (void )&encode, (void )&cmd); encode 声明如下: int encode(void *arg); 开始我想的是,会不会是encode前面不用加&呢?按照声明定义: pthread_create(&tid, &attr, (void *)myfunction, myarg); 第三个参数就是函数名而已,是为了表明线程函数的入口地址。但是,看的freescale提供的参考程序中有源码是这样的: pthread_create(&sigtid, NULL, (void *)&signal_thread, NULL); 也就是说,可以把第三个参数也即函数名前面加上&,两个效果一样。为了检验到底什么地方错误,还是改了一下: pthread_create(&dec_tid,NULL, (void )encode, (void )&cmd); 把encode前面 的&去掉,但是依然segmentation fault.。 网上找了一下,原因在于调试的时候没加 -lpthread!想要编译多线程的程序,必须如下编译: gcc -o test -lpthread test.c, 因为线程库不是内核自带的,要显式说明。问题是,为什么GCC在编译的时候不报错呢? 这个问题比较有难度。好了,原因找到了,怎么解决?Makefile 文件如下:

This Makefile is from http://isongzi.com which is to make send.out

CC=(CROSSCOMPILE)gccLINK=(CROSS_COMPILE)gcc
CROSS_COMPILE=arm-926ejs-linux-
OBJ = main.o /
enc.o /
capture.o /
fb.o /
socket.o / OBJDIR=./bin
LIBNAME = libvpu.a
LIBDIR = ./lib/

list of platforms which want this test case

INCLUDE_LIST:=IMX27ADS IMX31ADS MXC30031ADS IMX27MDK27V0 TARGET = send.out all: (TARGET)(TARGET1) (TARGET):(LIBDIR)(LIBNAME)(OBJ)
(LINK)L.lpthreado(TARGET) (OBJ)(LIBNAME)
mkdir -p (OBJDIR)mv(TARGET) $(OBJDIR) mv (LIBNAME)(OBJDIR) %.o: %.c
(CC)WallO2I(LIBDIR) -c o@ (LIBDIR)(LIBNAME):
make -C (LIBDIR)mv(LIBDIR)$(LIBNAME) . .PHONY: clean
clean:
rm -f (OBJDIR)/(TARGET) (OBJ)(LIBNAME)
原来,Makefile 里面加了 -lpthread啊,注意“lpthread” ! 到底哪里出问题了?待解。。 附:关于segmentation fault 的其他错误,请参考这里。 注:问题稀里糊涂地解决了。把Makefile中 (LINK)L.lpthreado(TARGET) (OBJ)(LIBNAME) 改为:(LINK)o(TARGET) -lpthread (OBJ)(LIBNAME) 其中,-lpthread 就相当于 /usr/lib/libpthread.a 这是unix编程的时候简单的做法。当然,如果有动态链接库的话,也代表相应的动态链接库。-lxxx =/usr/lib/libxxx.a 或者=/usr/lib/libxxx.so 另外,-L表示搜索库的位置。-L . 表示在当前位置搜索相应的库。 问题是,修改之前能编译、链接成功啊,两句不同之处就在于把-lpthread 放在了不同的位置,而已。。。