链接静态库 C

linked static libraries C

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

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

我的问题是编译主文件的最后一个命令,returns 我那个错误:

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 -L. -lsum

-L为目录,-lsum为库名

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

你必须link在图书馆,它不会自动寻找:

gcc main.c libsum.a

或者如果您愿意:

gcc main.c -L. -lsum

这些选项是:

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

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

gcc main.c sum.o

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

不止一个错误。我们先关注这里的警告:

main.c:5:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]

您忘记了 #include <stdio.h>printf() 在那里声明。在 C 中,在调用函数之前声明一个函数并不是绝对必要的,如果没有,则假定它接受任意数量的参数和 return int。但这只是遗产。始终确保实际 具有 声明 - 对于库函数,包括适当的 header.

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

gcc main.c

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

gcc main.c libsum.a

我现在没有尝试,但应该可以。