我已经创建了自己的样本库,并且想在主文件中使用它。我所有的代码是:

总和:

#ifndef _SUM_H_
#define _SUM_H_

int add(int n1, int n2);

#endif


摘要:

#include <stdio.h>
#include "sum.h"

int add(int n1, int n2)
{
     return n1 + n2;
}


main.c:

#include "sum.h"

int main(int argc, char* argv[])
{
    printf("%d", add(1, 2));

    return 0;
}


为了使用该库,我编写了以下命令:


  gcc -c -o sum.o sum.c
  
  ar rcs libsum.a sum.o
  
  gcc main.c


我的问题是,编译主文件的最后一个命令向我返回该错误:

main.c: In function ‘main’:
main.c:5:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]
  printf("%d", suma(1, 2));
  ^
/tmp/ccyhA7Bc.o: In `main' function:
main.c:(.text+0x1a): reference to `sum' undefined
collect2: error: ld returned 1 exit status


所有文件都在同一目录中。我的错误在哪里?我该如何解决?

最佳答案

您必须在库中链接,它不会自动查找:

gcc main.c libsum.a


或者,如果您喜欢:

gcc main.c -L. -lsum


这些选项是:


-L.将当前目录添加到库路径。通常只包括系统目录和编译器目录。
-lsum在库路径中查找libsum.a(或动态库变体libsum.so)。


请注意,只有一个目标文件的库不是很有用:您可以链接:

gcc main.c sum.o


关于警告,您必须在使用#include <stdio.h>的每个编译单元中均printf()。您在sum.c中具有它,但是这不能使声明可用于main.c。如果将它添加到sum.h中,则该文件将包含在内(并不是将随机的include添加到头文件中是个好主意)。

08-15 22:39