我试图为其他文件编写一个通用函数,以供其他文件重用,如下例所示,我有三个文件:
第一个文件:cat test1.h
void say();
第二个文件:cat test1.c
void say(){
printf("This is c example!");
}
第三个文件:cat test2.c
include "test1.h"
void main(){
say();
}
但是当我运行时:gcc -g -o test2 test2.c
它将错误抛出为:
undefined reference to `say'
另外:我知道这会起作用:gcc -g -o test2 test1.c test2.c
但我不想这样做,因为其他团队将使用服务器,并且希望他们直接使用我的二进制代码而不是源代码。我希望就像我们使用printf()函数一样,我们只需要include即可。
答案 0 :(得分:2)
您可以从包含有用功能的目标文件中构建自己的库,并将描述它们的标头存储在方便的位置。然后,您和您的同事使用标头进行编译,并将该库与使用这些功能中的任何一个的可执行文件链接。这与C编译器用来包含标准标头并自动链接到标准C库的通用机制几乎相同。
机制的差异取决于平台(Windows与Unix是主要区别,尽管Unix平台之间也有所不同)以及库的类型(静态档案库与动态链接/加载的库,也称为“共享对象或共享库)。
概括地说,对于具有静态库的Unix系统,您需要:
libfile1.o
编译库对象文件libfile2.o
,gcc -c libfile1.c libfile2.c
等。ar r libname.a libfile1.o libfile2.o
。/usr/local/include
。/usr/local/lib
。-I/usr/local/include
编译使用库函数的所有代码(如果还不是标准的编译选项)。-L/usr/local/lib -lname
链接程序(您可能不需要指定-L…
,但是您需要指定-lname
)。答案 1 :(得分:1)
包含头文件不会使功能可用。它只是通知编译器该功能将在以后提供。
您应将带有函数的文件编译成可共享的目标文件(如果要共享的函数不止一个,则应编译为库)。注意开关-c
,该开关告诉gcc
不要建立可执行文件:
gcc -o test1.o test1.c -c
类似地,将main函数编译到其自己的目标文件中。现在,您或其他任何人都可以将目标文件链接到其主程序:
gcc -o test2 test2.o test1.o
可以使用make
自动执行该过程。
答案 2 :(得分:1)
其他程序员可以在程序中使用编译的目标文件(* .o)。他们只需要具有函数原型,外部数据声明和类型定义的头文件即可。
您还可以将许多目标文件包装到库中。
在许多系统上,您也可以创建不必链接到可执行文件的动态链接库。
答案 3 :(得分:0)
您还需要编译test1:
gcc -g -o test2 test1.c test2.c
。