MacOS“错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)”

Posted

技术标签:

【中文标题】MacOS“错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)”【英文标题】:MacOS " error: linker command failed with exit code 1 (use -v to see invocation)" 【发布时间】:2022-01-20 23:48:58 【问题描述】:

我正在尝试编译我的程序 P2.c 但弹出此错误,我什至不知道从哪里开始:

ld: warning: ignoring file P2, building for macOS-arm64 but attempting to link with file built for unknown-unsupported file format ( 0x23 0x69 0x6E 0x63 0x6C 0x75 0x64 0x65 0x20 0x3C 0x73 0x74 0x64 0x69 0x6F 0x2E )
Undefined symbols for architecture arm64:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果有用,我会提供“酿造清单”:

% brew list
==> Formulae
ca-certificates         gdbm                    harfbuzz                libtiff                 lua                     pkg-config              xz
cairo                   gettext                 icu4c                   libx11                  lzo                     python@3.9
cython                  giflib                  jpeg                    libxau                  mpdecimal               qt@5
fontconfig              glib                    libcerf                 libxcb                  openssl@1.1             readline
freetype                gnuplot                 libffi                  libxdmcp                pango                   sqlite
fribidi                 gobject-introspection   libpng                  libxext                 pcre                    webp
gd                      graphite2               libpthread-stubs        libxrender              pixman                  xorgproto

有人建议删除 'binutils' 但我没有安装它,或者更改 $PATH 变量但我不知道他指的是什么;

% which ranlib
/usr/bin/ranlib
% $(which ranlib) -V
Apple Inc. version cctools-986
error: /Library/Developer/CommandLineTools/usr/bin/ranlib: no archives specified
Usage: /Library/Developer/CommandLineTools/usr/bin/ranlib [-sactfqLT] [-] archive [...]

我只是想编译和调试我的 P2.c,求助 :(

这是程序:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// Avaluar funcions: 1) f(x,y) ; 2) d/dx f(x,y) ; 3) d/dy f(x,y)
double f(double, double, double, double, double, double);
double fx(double, double, double, double, double, double);
double fy(double, double, double, double, double, double);
// 4) Predicció:
void p(double, double, double, double, double, double, double, double);
// 5) Correcció:
void c(double, double, double, double, double, double, double, double, double, double, double);
// 6) Main:
int main()

    double A = -0.8, B = 0.5, C = -1.2, D = 0.3;
    int n = 100000;
    double h = 1e-2;
    double pre = 1e-8;
    int iterMax = 5;
    double tol = 1e-6;
    char outputfile[30];
    FILE *fout;
    printf("Donem el nom del fitxer de sortda\n");
    scanf("%s", outputfile);
    fout = fopen(outputfile, "w");
    if (fout == NULL)
    
        printf("Error al obrir %s\n", outputfile);
        exit(1);
    
    // // Inicialitzem (x0, y0). He trobat els punts inicials mitjançant el programa:
    double x0 = 0.994910, y0 = 1.005750;
    double x = x0, y = y0;
    // Comprovem que son bons:
    if (abs(f(x, y, A, B, C, D)) > pre)
        return -1;

    return 0;

    // Imprimim el primer punt
    fprintf(fout, "%f\t %f\n", x, y);
    // Ara podem fer la continuació de la corba a partir d'aquest punt:
    printf("Imprimint primer sentit...");
    for (int i = 0; i < n / 2; i++)
    
        // Fem la predicció
        p(x, y, h, 1, A, B, C, D);
        // Fem la comprovació de punts singulars:
        if (sqrt(pow(fx(x, y, A, B, C, D), 2) + pow(fy(x, y, A, B, C, D), 2)) < tol)
        
            printf("Som molt a prop d'un punt singular!");
            return -4;
        
        // Fem la correcció
        c(x, y, x0, y0, h, iterMax, pre, A, B, C, D);
        // Imprimim el punt
        fprintf(fout, "%f\t %f\n", x, y);
    
    printf("Primer sentit imprès!");
    // Omplim els punts cap a l'altre sentit
    printf("Imprimint segon sentit...");
    x = x0;
    y = y0;
    for (int i = 0; i < n / 2; i++)
    
        // Fem la predicció
        p(x, y, h, -1, A, B, C, D);
        // Fem la comprovació de punts singulars:
        if (sqrt(pow(fx(x, y, A, B, C, D), 2) + pow(fy(x, y, A, B, C, D), 2)) < tol)
        
            printf("Som molt a prop d'un punt singular!");
            return -4;
        
        // Fem la correcció
        c(x, y, x0, y0, h, iterMax, pre, A, B, C, D);
        // Imprimim el punt
        fprintf(fout, "%f\t %f\n", x, y);
    
    printf("Segon sentit imprès!");
    printf("Procès completat!");
    return 0;


double f(double x, double y, double A, double B, double C, double D)

    return (16 * x * x * x * x + y * y * y * y + A * x * y * y - 16 * x * x * y - 1) * (x * x + (y - 1) * (y - 1) + B * x * y + C) + D;

double fx(double x, double y, double A, double B, double C, double D)

    return ((C + x * x + (-1 + y) * (-1 + y) + B * x * y) * (64 * x * x * x - 32 * x * y + A * y * y) + (2 * x + B * y) * (-1 + 16 * x * x * x * x - 16 * x * x * y + A * x * y * y + y * y * y * y));

double fy(double x, double y, double A, double B, double C, double D)

    return (2 * (C + x * x + (-1 + y) * (-1 + y) + B * x * y) * (-8 * x * x + A * x * y + 2 * y * y * y) + (-2 + B * x + 2 * y) * (-1 + 16 * x * x * x * x - 16 * x * x * y + A * x * y * y + y * y * y * y));

void p(double x, double y, double h, double sentit, double A, double B, double C, double D)

    // Calculem el gradient de f normalitzat i després trobem el tangent (u,v) ==tg==> (v, -u)
    double v[2] = sentit * fy(x, y, A, B, C, D) / sqrt(pow(fx(x, y, A, B, C, D), 2) + pow(fy(x, y, A, B, C, D), 2)), -sentit * fx(x, y, A, B, C, D) / sqrt(pow(fx(x, y, A, B, C, D), 2) + pow(fy(x, y, A, B, C, D), 2));
    // Ara trobem els nous x, y;
    x = x + h * v[0];
    y = y + h * v[1];

void c(double x, double y, double x0, double y0, double h, double iterMax, double pre, double A, double B, double C, double D)

    int iter = 0;
    // Volem resoldre el sistema utilitzant el metode de Newton:
    // Veiem si els punts verifiquen la precisió necessaria:
    while (fabs(f(x, y, A, B, C, D)) < pre)
    

        if (iter >= iterMax)
        
            exit(-2);
        
        // Fem iteracions del mètode de Newton
        // v = v - DF-1(x)*F(x)
        double x1 = x;
        double detJ = fx(x, y, A, B, C, D) * 2 * (y - y0) - fy(x, y, A, B, C, D) * 2 * (x - x0);
        if (fabs(detJ) == 0)
            exit(-3);
        x = x - (1 / detJ) * (2 * (y - y0) * f(x, y, A, B, C, D) - fy(x, y, A, B, C, D) * (pow((x - x0), 2) + pow((y - y0), 2) - h * h));
        y = y - (1 / detJ) * (-2 * (x1 - x0) * f(x1, y, A, B, C, D) + fx(x1, y, A, B, C, D) * (pow((x1 - x0), 2) + pow((y - y0), 2) - h * h));
        iter++;
    

非常感谢!

【问题讨论】:

如何构建程序?请edit您的问题向我们展示您使用的确切命令。 unknown-unsupported file format 表示您传递给链接器的文件 P2 不是为您的体系结构构建的目标文件。 【参考方案1】:

如果我们看一下链接器提供的十六进制数字序列:

0x23 0x69 0x6E 0x63 0x6C 0x75 0x64 0x65 ...

在 ASCII 字母表中拼写为 #inbclude

这告诉我们您正在尝试直接链接源文件,而不是编译它。

由于您使用的是 macOS 系统,请使用clang 程序编译链接源文件:

clang P2.c -o P2

在此之后,您应该在目录中有一个P2 可执行程序,然后您可以运行它:

./P2

【讨论】:

哇!太感谢了!!!问题解决了:) @Latheus What should I do when someone answers my question? ;)

以上是关于MacOS“错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)”的主要内容,如果未能解决你的问题,请参考以下文章

铿锵声:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)而实现?

Objective-C clang:错误:链接器命令失败,退出代码为 1

clang:错误:链接器命令失败,退出代码为 1,react-native

错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)xcode 错误?

clang++:错误:链接器命令失败,退出代码为 1 Qt Android

Xcode构建错误链接器命令失败,退出代码为1(使用-v查看调用)