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

本文探讨了在使用GCC编译多线程程序时遇到的段错误问题,重点解释了错误产生的原因及解决方案,包括Makefile中正确添加线程库链接选项-lpthread的重要性。通过案例分析,详细阐述了段错误的原因以及如何通过修改Makefile解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建线程【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 放在了不同的位置,而已。。。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值