c - GCC编译问题- fatal error : cannot find 'ld'

标签 c gcc

当我运行以下代码时,我得到 collect2: fatal error :找不到“ld” 编译终止。 作为输出。我的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("%d\n", x);
    return 0;
}

最佳答案

由于相同的编译命令在通过 shell 发出时有效,但在以编程方式发出时失败(如图所示),因此问题很可能与您提供给 execve() 的环境有关。请特别注意,提供给该函数的环境数组代表命令的整个环境,而不仅仅是额外的条目。

在这方面特别相关的是所提供的环境不包含 PATH 变量。因此,exec 进程需要使用完全限定的路径来依次启动任何命令,例如 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
    };

    // ...

关于c - GCC编译问题- fatal error : cannot find 'ld' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886330/

相关文章:

c - 在 GCC 中设置 std=c99 标志

lwn.net 中的container_of 示例代码

gcc/g++ 选项将所有目标文件放在单独的目录中

xcode - XCode 5 的命令行工具

c++ - 程序无法使用 g++ 编译

c - 创建节点的 malloc 数组时出现段错误

C 文件按行读取到自定义分隔符

python - 客户端(python程序)没有收到服务器(c程序)返回的响应?

c++ - GCC API 无法分解其自己的导出符号

c - 用于编译的 GCC 链接库