对'nCr'的未定义引用

时间:2016-05-06 15:43:07

标签: c linux reference linker undefined

我正在尝试编译我的程序以在Linux上运行但由于此错误它无法正常工作。

我用gcc -ansi -pedantic -Wall -m64 -o formula formula.c nCr.s编译,我得到的错误是:

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

以下是文件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_ */

并且有一个名为nCr.s

的程序集文件
    .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

非常感谢任何帮助,似乎无法弄清楚为什么它不编译。它在mac上编译得很好,但我需要在linux上运行它。

1 个答案:

答案 0 :(得分:1)

GCC无法找到extern int Factorial(int n);extern int nCr(int n, int r);定义,因为它们在您的asm文件中被称为_factorial:_nCr:。更改这些标签以匹配decl,您的代码将编译。

我注意到你在主函数中只有一个nCr的调用,所以我认为最好在你的.h中更改decls。因此,您的nCr.h将是:

#ifndef _NCR_H_
#define _NCR_H_

extern int _factorial(int n);

extern int _nCr(int n, int r);

#endif /* _NCR_H_ */

你必须在主要时间拨打_nCr(...)