c语言 - GCC 编译问题 - 致命错误:找不到'ld'



当我运行以下代码时,我会得到 collect2: fatal error: cannot find 'ld' compilation terminated.作为输出。我的GCC版本是gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0。似乎无法找到ld模块。我不知道该如何进行。

#define _GNU_SOURCE
#include<unistd.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int main(){
    char *stderr = "/home/vs/Desktop/test/output.txt";
    char *args[] = {"/usr/bin/gcc",
                    "-Wall",
                    "-O2",
                    "-std=gnu11",
                    "-fomit-frame-pointer",
                    "/home/vs/Desktop/test/Solution.c",
                    "-o",
                    "/home/vs/Desktop/test/Solution",
                    "-lm",
                    NULL};
    char *env[]  = {"LANG=en_US.UTF-8", "LANGUAGE=en_US:en", "LC_ALL=en_US.UTF-8", NULL};
    int fd;
    if(0 > (fd = open(stderr, O_WRONLY|O_TRUNC))) perror("open");
    if(0 > dup2(fd, 2)) perror("dup");
    if(fd != 2) close(fd);
    int x = execve("/usr/bin/gcc", args, env);
    printf("%dn", x);
    return 0;
}

由于通过shell发出相同的汇编命令工作,但如图所示,在编程发出时会失败,因此您向execve()提供的环境很可能存在问题。特别注意,提供给该功能的环境数组代表命令的全部环境,而不仅仅是额外的条目。

在这方面尤其重要的是,提供的环境不包括PATH变量。因此,Exec'd进程将需要使用完全Qualif的路径来依次启动的任何命令,例如ld。如果不这样做,则只会发生这样的错误。将PATH添加到指定的环境应解决问题。您可以从程序自己的环境中复制它,也可以更轻松地插入默认路径。例如,

    // ...
    char *env[]  = {
        "PATH=/usr/local/bin:/usr/bin:/bin",  // <--- this
        "LANG=en_US.UTF-8",
        "LANGUAGE=en_US:en",
        "LC_ALL=en_US.UTF-8",
        NULL
    };
    // ...

最新更新