GCC / C ++无法链接库

时间:2012-01-20 05:41:34

标签: c g++

我只是C ++的初学者。我正在尝试构建一些头文件header.h,但输出总是如下所示:

/tmp/ccTmZKXX.o: In function `main':
main.c:(.text+0x13): undefined reference to `func'
collect2: ld returned 1 exit status

你能帮我看一下我使用头文件的方式是否正确吗?非常感谢!

主要代码(main.c):

#include "stdio.h"
#include "func.h"

main() {
    double a = f(2.3);
    printf("a=%f\n", a);
}

func.c包含:

double func (double x) { return x ;}

func.h包含:

double func (double);

我编译:

gcc -o main main.c

3 个答案:

答案 0 :(得分:5)

这里有很多问题:

  1. GCC(GNU编译器集合)中的C ++编译器是g++,而不是gcc;后者是GNU C编译器。

  2. main.c中的代码是一个(不是很好的)C程序,而不是C ++程序。 C99禁止隐式int返回类型; C ++基本上从不允许它。

  3. 您的问题使用函数f;编译错误引用func。这意味着您没有向我们展示您尝试编译的代码。

  4. 标准说#include <stdio.h>;你也应该。

    #include <stdio.h>
    #include "func.h"
    
    int main()
    {
        double a = func(2.3);
        printf("a=%f\n", a);
    }
    

    NB :如果您使用C99,这是一个非常好的C程序。在C89中,您应该从main()返回一个值,而不是从最后一刻开始。#39; C99遵循C ++ 98并允许从结尾处掉头等同于显式return 0;。无论如何,我倾向于使用明确的return(0);(通常有,有时没有括号 - 编译器也不介意)。 (我使用-Wstrict-prototypes编译C;为了获得无警告编译,我写了int main(void),它也适用于C ++,但那里不需要void。)

    < / LI>
  5. 标题还可以,但您将在适当的时候了解header guards以及其他使标题更可靠的随身物品。

    #ifndef FUNC_H_INCLUDED
    #define FUNC_H_INCLUDED
    
    extern double func(double a);
    
    #endif /* FUNC_H_INCLUDED */
    

    extern不是强制性的。我倾向于使用它,但有许多人没有使用它。

  6. 定义函数的源文件应包含标头,以确保函数定义与声明一致。使用该函数的所有代码都应包含标题,以便在范围内有原型。这种交叉检查对可靠性至关重要。在使用函数之前,C ++需要范围内的原型;在定义函数之前,它不要求范围内的原型(但这样做是好的做法)。在C中强烈建议您在定义外部(非静态)函数之前使用范围内的原型。您可以将-Wmissing-prototypes与C代码和GCC一起使用来发现此类问题,但该选项对G ++无效。

    #include "func.h"
    
    double func(double x) { return x; }
    
  7. 由于这是一个C ++问题,我们可以考虑在标题中内联函数。实际上,C99还支持inline函数。但是,我们暂时可以忽略它。

  8. 由于这是一个C ++问题,我们可以认为使用<stdio.h>并不好,因为它不是类型安全的。使用<iostream>等可能会更好,尤其是因为它们是类型安全的。

    #include <iostream>
    #include "func.h"
    
    int main()
    {
        double a = func(2.3);
        std::cout << "a=" << a << std::endl;
    }
    
  9. 正确的编译需要主程序和它调用的函数,所以你可以写:

    g++ -o main main.c func.c
    

    或者,如果您在C中编译它,那么:

    gcc -std=c99 -o main main.c func.c
    

    请注意,-std=c99是必要的,以确保returnmain()的缺席是可以接受的。

    请注意,C ++源代码有几个扩展,包括.C.cpp.cxx,所有这些扩展都被G ++接受(以及{{1} })。

答案 1 :(得分:4)

这里有几个问题。

  1. 在func.h中定义函数如下

    extern double func(double);
    
  2. 编译时,提供所有源(c,cpp)文件

    gcc main.c func.c -o main
    
  3. 你应该好好去。

答案 2 :(得分:1)

像这样编译:

gcc -o main main.c func.c

然后就没事了。