首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对“nCr”的未定义引用

对“nCr”的未定义引用
EN

Stack Overflow用户
提问于 2016-05-06 15:43:07
回答 1查看 152关注 0票数 0

我试图编译我的程序以在linux上运行,但由于这个错误,它无法工作。

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

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

这是文件公式中的代码

代码语言:javascript
复制
#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

代码语言:javascript
复制
#ifndef _NCR_H_
#define _NCR_H_

extern int Factorial(int n);

extern int nCr(int n, int r);

#endif /* _NCR_H_ */

还有一个名为nCr.s的程序集文件

代码语言:javascript
复制
    .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上运行。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-06 15:56:41

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

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

代码语言:javascript
复制
#ifndef _NCR_H_
#define _NCR_H_

extern int _factorial(int n);

extern int _nCr(int n, int r);

#endif /* _NCR_H_ */

你必须在main打电话给_nCr(...)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37076426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档