使用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
相关产品推荐
相关产品推荐

