You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:17:29