簡體   English   中英

在GCC中獲取C程序的鏈接錯誤

[英]Getting a Linking Error for C Program in GCC

我一直試圖找出為什么當gcc嘗試將目標文件鏈接在一起時出現此特定錯誤的原因:

Undefined                       first referenced
 symbol                             in file
main                                /usr/local/gcc_4.7.1/lib/gcc/sparc-sun-solaris2.10/4.7.1/crt1.o
ld: fatal: symbol referencing errors. No output written to complex
collect2: error: ld returned 1 exit status

調用您正在查看的代碼即可使用。 目的是能夠理解makefile並將所有這些文件鏈接到gcc上。 我相信問題來自makefile或main.c。 請幫助我已經嘗試糾正了幾個小時。 我一直在使用的命令是:

make makefile
gcc complex.c -o complex -lm

我已經在網上進行了徹底的搜索,以查找造成這種情況的原因,但對我來說,這些都沒有意義。 下面,我將放置我要鏈接的三個文件:complex.c,main.c complex.h和我的makefile。

complex.c:

 // Figure 11.10  Partial Implementation of Type and Operators for Complex Numbers
    /*
     *  Operators to process complex numbers
     */

    /*  User-defined complex number type */
    #include <stdio.h>
    #include <math.h>
    #include "complex.h"


    /*
     *  Complex number input function returns standard scanning error code
     *    1 => valid scan, 0 => error, negative EOF value => end of file
     */
    int
    scan_complex(complex_t *c) /* output - address of complex variable to 
           fill     */
    {
          int status;

          status = scanf("%lf%lf", &c->real, &c->imag);
          if (status == 2)
                status = 1;
          else if (status != EOF)
                status = 0;

          return (status);
    }

    /*
     *  Complex output function displays value as (a + bi) or (a - bi),
     *  dropping a or b if they round to 0 unless both round to 0
     */
    void
    print_complex(complex_t c) /* input - complex number to display   */
    {
          double a, b;
          char   sign;

          a = c.real;
          b = c.imag;

          printf("(");

          if (fabs(a) < .005  &&  fabs(b) < .005) {
                printf("%.2f", 0.0);
          } else if (fabs(b) < .005) {
                printf("%.2f", a);
          } else if (fabs(a) < .005) {
                printf("%.2fi", b);
          } else {
                if (b < 0)
                      sign = '-';
                else
                      sign = '+';
                printf("%.2f %c %.2fi", a, sign, fabs(b));
          }

          printf(")");
    }

    /*
     *  Returns sum of complex values c1 and c2
     */
    complex_t
    add_complex(complex_t c1, complex_t c2) /* input - values to add    */
    {
          complex_t csum;

          csum.real = c1.real + c2.real;
          csum.imag = c1.imag + c2.imag;

          return (csum);
    }

    /*
     *  Returns difference c1 - c2
     */
    complex_t
    subtract_complex(complex_t c1, complex_t c2) /* input parameters    */
    {
          complex_t cdiff;
          cdiff.real = c1.real - c2.real;
          cdiff.imag = c1.imag - c2.imag;

          return (cdiff);
    }

    /*  ** Stub **
     *  Returns product of complex values c1 and c2
     */
    complex_t
    multiply_complex(complex_t c1, complex_t c2) /* input parameters    */
    {
          complex_t cmul;
          double a, b, c, d;
          a = c1.real;
          b = c1.imag;
          c = c2.real;
          d = c2.imag;

          if (( b > 0 && d < 0) || (b < 0 && d > 0))
          {
              cmul.real - (a*c) + (fabs(b)*fabs(d));
              cmul.imag = (a*d) + (b*c);
          }
          else if (( b>0 && d>0) || (b<0 && d<0))
          {
          cmul.real = (a*c) - (b*d);
          cmul.imag = (a*d) + (b*c);
      }
          return (cmul);
    }

    /*  ** Stub **
     *  Returns quotient of complex values (c1 / c2)
     */
    complex_t
    divide_complex(complex_t c1, complex_t c2) /* input parameters     */
    {
          complex_t cdiv;
          double a, b, c, d;
          a = c1.real;
          b = c1.imag;
          c = c2.real;
          d = c2.imag;

          if ( b > 0 && d < 0)
          {
              cdiv.real = (a*c) - (fabs(b)*fabs(d)) / ((c*c) + (d*d));
              cdiv.imag = (a*d) + (b*c) / ((c*c) + (d*d));
          }
          else if ( b>0 && d>0)
          {
              cdiv.real = (a*c) - (fabs(b)*fabs(d)) / ((c*c) + (d*d));
              cdiv.imag = ((-1*a*d) + (b*c)) / ((c*c) + (d*d));
      }
          else if (b<0 && d<0)
      {
             cdiv.real = (a*c) + (fabs(b)*fabs(d)) / ((c*c) + (d*d));
             cdiv.imag = ((-1*a*d) + (b*c)) / ((c*c) + (d*d));
      }
      else if (b<0 && d<0)
      {
            cdiv.real = (a*c) + (fabs(b)*fabs(d)) / ((c*c) + (d*d));
            cdiv.imag = ((a*fabs(d)) + (b*c)) / ((c*c) + (d*d));
      }
          return (cdiv);
    }
    /*
     *  Returns absolute value of complex number c
     */
    complex_t
    abs_complex(complex_t c) /* input parameter                        */
    {
          complex_t cabs;

          cabs.real = sqrt(c.real * c.real + c.imag * c.imag);
          cabs.imag = 0;

          return (cabs);
    }

main.c

#include <stdio.h>
#include "complex.h"

int main (void)
{
      complex_t com1, com2;

      /*  Gets two complex numbers  */
      printf("Enter the real and imaginary parts of a complex number\n");
      printf("separated by a space> ");
      scan_complex(&com1);
      printf("Enter a second complex number> ");
      scan_complex(&com2);

      /*  Forms and displays the sum    */
      printf("\n");
      print_complex(com1);
      printf("  +  ");
      print_complex(com2);
      printf("  =  ");
      print_complex(add_complex(com1, com2));

      /*  Forms and displays the difference                 */
      printf("\n\n");
      print_complex(com1);
      printf("  -  ");
      print_complex(com2);
      printf("  =  ");
      print_complex(subtract_complex(com1, com2));

      /*  Forms and displays the multiplication */
      printf("\n");
      print_complex(com1);
      printf("  *  ");
      print_complex(com2);
      printf("  =  ");
      print_complex(multiply_complex(com1, com2));

      /*  Forms and displays the division   */
      printf("\n");
      print_complex(com1);
      printf("  /  ");
      print_complex(com2);
      printf("  =  ");
      print_complex(divide_complex(com1, com2));

      /*  Forms and displays the absolute value of the first number     */
      printf("\n\n|");
      print_complex(com1);
      printf("|  =  ");
      print_complex(abs_complex(com1));
      printf("\n");

      return (0);
}

complex.h:

typedef struct {
      double real, imag;
} complex_t;

int scan_complex(complex_t *c);
void print_complex(complex_t c);
complex_t add_complex(complex_t c1, complex_t c2);
complex_t subtract_complex(complex_t c1, complex_t c2);
complex_t multiply_complex(complex_t c1, complex_t c2);
complex_t divide_complex(complex_t c1, complex_t c2);
complex_t abs_complex(complex_t c);

生成文件:

complex: main.o complex.o
    gcc -o complex main.o complex.o -lm
main.o: complex.h
    gcc -c main.c
complex.o: complex.h
    gcc -c complex.c

只需輸入make

更傳統的做法是將主要的生成文件拼寫為“ Makefile”(大寫的M)。

例如,如果要命名makefile,則需要使用-f選項明確顯示名稱,例如make -f Makefile.com :例如, make -f Makefile.com

我沒有發現make文件本身有什么問題。

您不需要運行gcc命令,只需要make

$ make
$ ./complex

使用gcc命令,您嘗試將complex.c單獨編譯為二進制可執行文件,因為它沒有主要功能,因此當然不能工作。

如果要直接使用gcc編譯二進制文件,只需包含兩個源文件:

$ gcc -o complex main.c complex.c -lm

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM