c - 链接静态库 C

标签 c libraries

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

Sum.h:

#ifndef _SUM_H_
#define _SUM_H_

int add(int n1, int n2);

#endif

总和.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

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

最佳答案

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

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

关于c - 链接静态库 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33133935/

相关文章:

c - C 中的数组传递

c - 将整数数组加载到 AVX 寄存器中

jboss - ClassCastException : MyFilter cannot be cast to javax. servlet.Filter

c - 做了一些指针数学但不起作用

c - 警告 : missing braces around initializer [-Wmissing-braces] (IN MACRO)

c - 在 C 中将整数分类/映射到各种类别的优雅方法是什么?

c - 如何在 C 中创建和使用我自己的静态库?

java - 在eclipse中的另一个用户库中添加用户库

java - Java 内部库与外部库

java - 如何将JFreeChart库添加到JDK?错误: package org. jfree.chart不存在