使用make编译C多线程代码时出现pthread函数未定义引用错误如何解决?
报错根因
你遇到的是链接阶段的典型错误,触发原因如下:
- pthread(POSIX线程库)不属于Linux GCC默认链接的标准库,必须在编译时显式指定链接该库,否则链接器无法找到
pthread_create、pthread_join等线程API的实现。 - 你当前Makefile中的编译命令没有添加链接pthread库的参数,直接触发了未定义引用报错。
修复方案
1. 核心修复:修改Makefile编译规则
在编译命令末尾添加-lpthread参数,同时修正原Makefile中clean规则的语法错误(原rm*.o缺少空格,无法正确执行),修改后的完整Makefile如下:
threadcircuit: threadcircuit.c cc -o threadcircuit threadcircuit.c -lpthread clean: rm *.o threadcircuit
修改后重新执行make命令即可完成编译。
2. 可选:代码逻辑优化建议
当前代码存在两个可靠性问题,建议同步修正避免运行结果异常:
- 全局变量
count是多线程共享的可写变量,当前没有加互斥锁保护,多线程同时修改时会出现竞态条件,导致最终统计的解数量不准确,建议添加pthread_mutex_t互斥锁,在修改count的位置加锁保护。 - 当前创建线程时给所有线程传入同一个
mmdata结构体的地址,虽然加了sleep(1)保证线程先读取参数,但属于不可靠的实现方式,建议为每个线程单独分配min_max_data结构体存储参数。
内容的提问来源于stack exchange,提问作者Michael Garrido
相关产品推荐
相关产品推荐

