如何将编译器路径作为变量参数传入exec函数?
解决方案
直接修改代码,从命令行参数中读取编译器路径,并调整参数数组传递给execvp即可,具体实现如下:
// 编译命令:gcc prog.c -o prog #include <unistd.h> #include <stdio.h> int main(int argc, char *argv[]) { // 校验输入参数:必须至少传入编译器路径 if (argc < 2) { fprintf(stderr, "用法: %s <编译器路径/名称> [编译链接参数...]\n", argv[0]); return 1; } // 用命令行第一个参数作为编译器,后续参数直接传递 // argv+1 构成新的参数数组:[编译器名, 参数1, 参数2, ..., NULL] execvp(argv[1], argv + 1); // 走到这里说明execvp执行失败 perror("execvp 调用失败"); return 1; }
关键说明
- 运行时直接通过命令行传入编译器和参数,比如你需要的:
./prog mips64-unknown-linux-gcc --sysroot=<<...>> -O3 -Wl -L <<...>> -L <<...>> -I <<...>> -L <<...>> abcd.o a1.o b2.o -o prog execvp会自动处理两种情况:如果传入的是编译器的绝对/相对路径,直接执行;如果是文件名(比如gcc),则会在PATH环境变量中查找对应程序。- 参数校验避免了用户未传入编译器时的无意义崩溃,错误提示更清晰。
execvp成功执行后,当前进程会被编译器进程完全替换,不会返回;只有执行失败时才会走到后续的错误处理逻辑。
内容的提问来源于stack exchange,提问作者Sundeep KOKKONDA
相关产品推荐
相关产品推荐

