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

如何用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)

解决方法

  1. 使用SBCL的绝对路径
    先在终端执行which sbcl命令,获取SBCL可执行文件的绝对路径(例如/usr/bin/sbcl),然后将代码中的"sbcl"替换为该路径:

    output = popen("/usr/bin/sbcl", "r");
    

    原因:popen启动的shell环境可能未将SBCL所在目录加入PATH,使用绝对路径可直接定位到可执行文件。

  2. 显式设置环境变量PATH
    如果不想使用绝对路径,可以在popen的命令中指定包含SBCL的路径到PATH:

    // 替换为实际的SBCL所在目录
    output = popen("PATH=$PATH:/usr/bin sbcl", "r");
    
  3. 确认SBCL已安装
    如果执行which sbcl无输出,说明SBCL尚未安装,可通过Fedora的包管理器安装:

    sudo dnf install sbcl
    

内容的提问来源于stack exchange,提问作者Oliver Cox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:56:15