在CLion中使用wc作为execvp参数报错,如何启用GNU扩展?
解决CLion中execvp调用wc提示文件不存在的问题
其实你碰到的根本不是GNU扩展启用的问题,而是CLion默认的运行工作目录和终端当前目录不一致导致的!
问题根源解释
在终端里,你是直接在temp.c所在的目录下编译运行程序的,所以wc能直接找到同目录的temp.c;但CLion默认的运行工作目录是项目根目录(或者是cmake-build-debug这类编译输出目录),而不是你的源代码所在目录,所以程序执行时找不到temp.c,才会报错wc: temp.c: No such file or directory。
解决方法(推荐第一种)
方法一:修改CLion运行配置的工作目录
这是最方便且通用的做法:
- 点击CLion右上角的运行配置下拉菜单(显示当前运行目标的地方),选择「Edit Configurations...」
- 在弹出的配置窗口中,找到你当前的运行目标(比如对应
a.out的那个配置) - 找到「Working directory」选项,点击右侧的文件夹图标,选择
temp.c所在的目录(如果你的源代码在项目根目录下,直接选项目根目录即可,也可以手动输入$PROJECT_DIR$/加上相对路径) - 点击「Apply」保存配置,然后重新运行程序即可
方法二:在代码中使用绝对路径指定文件(不推荐)
如果你只是临时测试,可以直接把temp.c的路径改成绝对路径:
myargs[1] = strdup("/home/your-username/your-project-path/temp.c");
但这种方式不够灵活,换环境或者移动项目后就会失效。
方法三:动态获取程序所在目录拼接文件路径(进阶)
如果需要程序自动适配路径,可以在代码中先获取当前可执行文件的所在目录,再拼接temp.c的路径(Linux下示例):
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/wait.h> #include <limits.h> int main(int argc, char *argv[]) { char exe_path[PATH_MAX]; ssize_t len = readlink("/proc/self/exe", exe_path, sizeof(exe_path)-1); if (len != -1) { exe_path[len] = '\0'; // 去掉可执行文件名,得到目录路径 char *dir_end = strrchr(exe_path, '/'); if (dir_end) { *dir_end = '\0'; } // 拼接temp.c的路径 char temp_path[PATH_MAX]; snprintf(temp_path, sizeof(temp_path), "%s/temp.c", exe_path); char *myargs[3]; myargs[0] = strdup("wc"); myargs[1] = strdup(temp_path); myargs[2] = NULL; execvp(myargs[0], myargs); } perror("readlink failed"); return 1; }
补充说明
wc是系统自带的标准命令,CLion的运行环境里已经包含了它的路径(PATH环境变量正常),所以不需要额外启用什么GNU扩展,之前的错误完全是文件路径的问题~
内容的提问来源于stack exchange,提问作者Li Chen
相关产品推荐
相关产品推荐

