2016-05-06 18 views
0

Ich versuche, mein Programm zu kompilieren, um auf Linux zu laufen, aber es funktioniert nicht wegen dieses Fehlers.undefined Verweis auf 'nCr'

kompilieren ich mit gcc -ansi -pedantic -Wall -m64 -o Formel formula.c nCr.s und der Fehler, den ich bekommen ist:

/tmp/ccnNz7Jr.o: In function `main': 
formula.c:(.text+0xc1): undefined reference to `nCr' 
collect2: ld returned 1 exit status 
make: *** [build] Error 1 

Hier ist der Code ist aus der Datei formula.c

#include <stdio.h> 
#include <stdlib.h> 
#include "nCr.h" 
#include <time.h> 
#include <sys/time.h> 

int main(int argc, const char * argv[]) 
{ 
int x = 0; 
int y; 
int z; 

struct timeval start, end; 

if (argv[1][0] == '-' && argv[1][1] == 'h') { 
    printf("Usage: formula <positive integer>"); 
} else { 
    y = atoi(argv[1]); 

    gettimeofday(&start, NULL); 

    printf("(1 + x)^%i = 1+", y); 

    if (y == 0) 
     printf("0"); 


    if (y > 12) { 
     printf("%s\n","Please enter a number 12 or below. Anything higher results in overflow, the answer you want is not the answer you will get."); 
    } 

    for (; x <= y; x++) { 

     z = nCr(y, x); 

     if (z == -1) { 
      printf("Multiplication overflow. \n"); 
      return 1; 
     } else { 
      if (x != 0) 
       printf("%i x^%i ",z , x); 

      if (x != y && x != 0) 
       printf("+ "); 
     } 
    } 

    gettimeofday(&end, NULL); 

} 

printf("\n%ld microseconds\n", ((end.tv_sec * 1000000 + end.tv_usec) 
     - (start.tv_sec * 1000000 + start.tv_usec))); 

return 0; 
} 

ncr.h

#ifndef _NCR_H_ 
#define _NCR_H_ 

extern int Factorial(int n); 

extern int nCr(int n, int r); 

#endif /* _NCR_H_ */ 

und es gibt eine nCr.s genannt Baugruppendatei

.globl _factorial 
    _factorial: 
    Leh_func_begin2: 
    pushq %rbp 
    Ltmp3: 
movq %rsp, %rbp 
Ltmp4: 
movl %edi, -4(%rbp) 
movl $1, -16(%rbp) 
movl $1, -20(%rbp) 
jmp LBB2_2 
LBB2_1: 
movl -16(%rbp), %eax 
movl -20(%rbp), %ecx 
imull %ecx, %eax 
movl %eax, -16(%rbp) 
movl -20(%rbp), %eax 
addl $1, %eax 
movl %eax, -20(%rbp) 
LBB2_2: 
movl -20(%rbp), %eax 
movl -4(%rbp), %ecx 
cmpl %ecx, %eax 
jle LBB2_1 
movl -16(%rbp), %eax 
movl %eax, -12(%rbp) 
movl -12(%rbp), %eax 
movl %eax, -8(%rbp) 
movl -8(%rbp), %eax 
popq %rbp 
ret 

.globl _nCr 
_nCr: 
Leh_func_begin1: 
pushq %rbp 
Ltmp0: 
movq %rsp, %rbp 
Ltmp1: 
subq $32, %rsp 
Ltmp2: 
movl %edi, -4(%rbp) 
movl %esi, -8(%rbp) 
movl -4(%rbp), %eax 
xorb %cl, %cl 
movl %eax, %edi 
movb %cl, %al 
callq _factorial 
movl %eax, %ecx 
movl %ecx, -20(%rbp) 
movl -4(%rbp), %ecx 
movl -8(%rbp), %edx 
subl %edx, %ecx 
movl %ecx, -24(%rbp) 
movl -8(%rbp), %ecx 
xorb %dl, %dl 
movl %ecx, %edi 
movb %dl, %al 
callq _factorial 
movl %eax, %ecx 
movl -24(%rbp), %edx 
xorb %sil, %sil 
movl %edx, %edi 
movb %sil, %al 
movl %ecx, -32(%rbp) 
callq _factorial 
movl %eax, %ecx 
movl -32(%rbp), %esi 
imull %ecx, %esi 
movl %esi, -28(%rbp) 
movl -20(%rbp), %ecx 
movl -28(%rbp), %esi 
movl %ecx, %eax 
cltd 
idivl %esi 
movl %eax, %ecx 
movl %ecx, -16(%rbp) 
movl %ecx, -12(%rbp) 
movl -12(%rbp), %eax 
addq $32, %rsp 
popq %rbp 
ret 

Jede Hilfe wird sehr geschätzt, scheint nicht herauszufinden, warum es nicht kompiliert. Es kompiliert einfach gut auf Mac, aber ich muss es auf Linux laufen lassen.

+0

change 'extern int Factorial ...' zu 'extern int _factorial ...' und ändere 'extern int nCr ...' zu 'extern int _nCr ...' in 'ncr.h'. Sie sagen gcc, dass es die Definitionen von 'Factorial' und' nCr' in einer anderen Datei finden wird, aber Ihre .s definiert sie als '_factorial' und' _nCr'. Oder Sie können die Namen Ihrer asm-Datei ändern und Änderungen bei Funktionsaufrufen vermeiden. – ddz

+0

DANKE! Das hat es endlich behoben, mir die letzten 2 Stunden die Haare rausgezogen. Sehr zu schätzen wissen. – billz

Antwort

1

GCC ist nicht in der Lage extern int Factorial(int n); und extern int nCr(int n, int r); Definitionen zu finden, weil sie _factorial: und _nCr: in Ihrer asm-Datei aufgerufen werden. Ändern Sie diese Bezeichnungen so, dass sie mit decl übereinstimmen und Ihr Code wird kompiliert.

Ich bemerkte, dass Sie nur einen Anruf von nCr in der Hauptfunktion haben, also denke ich, dass es besser ist, decls in Ihrem .h zu ändern. Also Ihr nCr.h wird:

#ifndef _NCR_H_ 
#define _NCR_H_ 

extern int _factorial(int n); 

extern int _nCr(int n, int r); 

#endif /* _NCR_H_ */ 

Und Sie haben _nCr(...) an Haupt nennen.