main.c:(.text+0x30):对"互惠"的未定义引用

main.c:(.text+0x30): undefined reference to `reciprocal'

本文关键字:互惠 未定义 引用 text+0x30 main      更新时间:2023-10-16

我正在尝试Advance Linux编程的第一个程序。其他一些人也感觉到了这个问题,但阅读这些帖子对我没有帮助。我也尝试过这些方法,但我的问题仍然存在。请帮帮我。

这是主要的.c

#include <stdio.h>
#include "reciprocal.hpp"
int main(int argc, char const *argv[])
{
    int i;
    i = atoi(argv[1]);
    printf("The reciprocal of %d is %gn", i, reciprocal(i));
    return 0;
}

正在列出往复式.cpp

#include <cassert>
#include "reciprocal.hpp"
using namespace std;

    double reciprocal(int i) {
        //I should not be Zero
        assert(i != 0);
         return 1.0/i;
    }

反向上市.hpp

#ifdef _cplusplus
extern "C" {
#endif
  extern double reciprocal (int i);
#ifdef _cplusplus
}
#endif

正在列出Makefile:

reciprocal: main.o reciprocal.o
    g++ $(CFLAGS) -o reciprocal main.o reciprocal.o
main.o: main.c reciprocal.hpp
    gcc $(CFLAGS) -c main.c -I ../include
reciprocal.o: reciprocal.cpp reciprocal.hpp
    g++ $(CFLAGS) -c reciprocal.cpp -I ../include
clean:
    rm -f *.o reciprocal

错误为:

rajat$ make
gcc  -c main.c -I ../include
g++  -c reciprocal.cpp -I ../include
g++  -o reciprocal main.o reciprocal.o
main.o: In function `main':
main.c:(.text+0x30): undefined reference to `reciprocal'
collect2: error: ld returned 1 exit status
make: *** [reciprocal] Error 1

您的宏中应该有__cplusplus(正确的宏定义),而不是_cplusplus


如何调试:在main.o:中查找未定义的reciprocal

nm main.o | grep reciprocal
                 U reciprocal

并在您的reciprocal.o:中查找

  • __cplusplus:

    $ nm reciprocal.o | grep reciprocal
    0000000000000000 T reciprocal
    0000000000000020 r _ZZ10reciprocalE19__PRETTY_FUNCTION__
    
  • 无(如您所写的_cplusplus):

    $ nm reciprocal.o | grep reciprocal
    0000000000000000 T _Z10reciprocali
    0000000000000020 r _ZZ10reciprocaliE19__PRETTY_FUNCTION__