如何用popen启动SBCL?C调用外部命令报错解决方案问询
问题:C语言调用popen执行sbcl提示"command not found"
我正在用C语言开发GUI原型,该GUI会触发Lisp编写的后端函数。出于测试目的,计划通过C语言的popen函数启动SBCL编译器执行Lisp命令,暂不考虑更高级的实现方式。
参考相关教程编写了如下代码:
#define BUFFER 256 // 补充原代码缺失的BUFFER定义 int outputter(void){ FILE *output; char buffer[BUFFER]; output = popen("sbcl", "r"); if (output == NULL) { fputs("POPEN: Failed.\n", stderr); } else { int count = 0; while(fgets(buffer, BUFFER-1, output) != NULL) { printf("OUTPUT[%d]: %s", count, buffer); count ++; } } pclose(output); return 0; }
运行该函数时,出现报错:sh: line 1: sbcl: command not found。
已查阅相关问题但未找到解决方向,环境信息如下:
- 操作系统:Fedora 38
- 开发语言:C
- IDE:Gnome Builder
- Shell:GNU bash,版本5.2.15 release (x86_64-redhat-linux-gnu)
解决方法
使用SBCL的绝对路径
先在终端执行which sbcl命令,获取SBCL可执行文件的绝对路径(例如/usr/bin/sbcl),然后将代码中的"sbcl"替换为该路径:output = popen("/usr/bin/sbcl", "r");原因:
popen启动的shell环境可能未将SBCL所在目录加入PATH,使用绝对路径可直接定位到可执行文件。显式设置环境变量PATH
如果不想使用绝对路径,可以在popen的命令中指定包含SBCL的路径到PATH:// 替换为实际的SBCL所在目录 output = popen("PATH=$PATH:/usr/bin sbcl", "r");确认SBCL已安装
如果执行which sbcl无输出,说明SBCL尚未安装,可通过Fedora的包管理器安装:sudo dnf install sbcl
内容的提问来源于stack exchange,提问作者Oliver Cox
相关产品推荐
相关产品推荐

