链接静态库 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
那么它就会被包含(并不是说将随机 include
s 添加到你的头文件是个好主意)。
不止一个错误。我们先关注这里的警告:
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
我现在没有尝试,但应该可以。
我已经制作了自己的样本库,我想在我的主文件中使用它。我所有的代码是:
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
那么它就会被包含(并不是说将随机 include
s 添加到你的头文件是个好主意)。
不止一个错误。我们先关注这里的警告:
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
我现在没有尝试,但应该可以。