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

使用fexecve调用C编译器时找不到ld的问题求助

问题分析与解决方案

你遇到的错误和compiler_argv的结构无关,核心问题是传递了空的环境变量数组。当fexecve执行cc时,空环境下不存在PATH变量,编译器无法定位到/usr/bin下的ld工具——即便ld确实存在,系统也不知道该去哪里查找它。

解决方案1:传递当前进程的环境变量

直接使用全局变量environ(需包含<unistd.h>头文件),它保存了当前进程的完整环境变量:

#include <unistd.h>  // 引入environ变量的定义

/* compile */
char* compiler_argv[] = {"/usr/bin/cc", "math.c", "-o", "math", NULL};
int compiler_fd = open("/usr/bin/cc", O_RDONLY | O_CLOEXEC);
if (fexecve(compiler_fd, compiler_argv, environ) < 0) {
    printf("Could not compile math program\n");
}

解决方案2:手动设置必要的环境变量

如果不想传递全部环境变量,可仅设置编译器需要的PATH变量:

char* compiler_envp[] = {
    "PATH=/usr/bin:/bin",  // 包含ld所在的/usr/bin目录
    NULL
};
char* compiler_argv[] = {"/usr/bin/cc", "math.c", "-o", "math", NULL};
int compiler_fd = open("/usr/bin/cc", O_RDONLY | O_CLOEXEC);
if (fexecve(compiler_fd, compiler_argv, compiler_envp) < 0) {
    printf("Could not compile math program\n");
}

注:添加O_CLOEXEC标志可以避免子进程继承不必要的文件描述符,是更规范的写法。

内容的提问来源于stack exchange,提问作者Calder Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 16:41:08