如何在Solaris系统中使用cc编译含pthread的C程序?
在Solaris上使用cc编译带pthread的C程序的解决方案
你遇到的两个错误是独立的,我们逐个拆解解决:
1. 修复pthread_create参数类型不匹配问题
Solaris的pthread_create对线程函数的类型要求非常严格,它要求的函数原型是:
void *(*start_routine)(void *)
而你的main_thread定义是void main_thread(void *closure),返回类型是void而非void*,这直接导致了类型不匹配;另外你强行把函数指针转成(void *)也是不符合C标准的操作,Solaris的cc会严格校验这一点。
具体修改:
调整main_thread的返回类型为void*,并在函数末尾添加返回语句(哪怕你不需要返回值):
void *main_thread(void *closure) { // 修改返回类型为void* struct sched_args *args = (struct sched_args *)closure; int i = args->i; struct scheduler *s = args->s; /* 你的业务逻辑代码 */ // 别忘了释放malloc分配的参数结构体,避免内存泄漏 free(args); return NULL; // 必须返回void*类型的值 }
然后修改pthread_create的调用,去掉多余的强制转换:
pthread_create(&s->tab_thread[i], NULL, main_thread, new_args_sched(i, s));
这样就能解决第一个参数不兼容的错误了。
2. 修复链接阶段的soname错误
这个错误源于Solaris cc与gcc的链接参数逻辑差异:-pthread是gcc特有的参数,cc并不识别;同时cc处理动态链接的默认行为也和gcc不同。
正确的编译&链接命令
Solaris的cc(Sun Studio编译器)启用多线程支持需要用-mt选项,它会自动处理编译时的多线程头文件依赖和链接时的pthread库关联,不需要额外加-lpthread。调整后的命令如下:
编译生成目标文件:
cc -c quicksort.c sched.c -g -mt -O3 -std=c99
说明:如果你的代码里有C99特性(比如变长数组),加上
-std=c99;如果cc只支持C90,就去掉这个选项,同时要把代码里的C11/C99特性改成C90兼容写法(比如替换变长数组为动态分配)。
链接生成可执行文件:
cc -o quicksort quicksort.o sched.o -g -mt -O3 -Wall
解释:
-mt替代gcc的-pthread,-Wall在cc中同样有效,其他参数保持你的原有需求即可。
额外提醒
- 一定要在
main_thread里释放new_args_sched分配的结构体,否则会造成内存泄漏; - 如果你的代码包含C11特有的语法(比如
_Thread_local、static_assert),需要手动修改为C90/C99兼容的实现,因为老版本Solaris cc大概率不支持C11; - 若编译时还有语法报错,优先检查是否是C标准兼容问题,比如把
//注释改成/* */,或者调整变量声明位置(C90要求变量声明在代码块开头)。
内容的提问来源于stack exchange,提问作者GuroItuyoshi
相关产品推荐
相关产品推荐

