链接静态库C.

时间:2015-10-14 19:26:41

标签: c libraries

我已经创建了自己的示例库,我想在我的主文件中使用它。我的所有代码都是:

Sum.h:

#ifndef _SUM_H_
#define _SUM_H_

int add(int n1, int n2);

#endif

Sum.c:

#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

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

3 个答案:

答案 0 :(得分:4)

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

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添加到您的头文件中是个好主意。)

答案 1 :(得分:2)

使用

gcc main.c -L. -lsum

目录的-L和库名称的-lsum

另一个错误是因为您没有为<stdio.h>添加main

答案 2 :(得分:1)

有多个错误。让我们首先关注这里的警告:

  

main.c:5:2:警告:内置函数'printf'的不兼容隐式声明[默认启用]

你忘了#include <stdio.h>printf()在那里宣布。在C中没有必要在调用函数之前声明函数,如果没有函数,则假定它接受任意数量的参数并返回int。但这只是遗产。始终确保实际拥有声明 - 对于库函数,请包含相应的标题。

然后到链接器错误:这很容易解释:

  

gcc main.c

此命令尝试仅将main.c编译为可执行文件。这不起作用,因为在main.c中,您调用在另一个模块中定义的函数,而不是神奇地可用于编译器。在您的情况下,只需将您的库添加到命令行:

  

gcc main.c libsum.a

我现在没有尝试,但它应该有效。