如何编写通用函数以在C中重用

时间:2019-05-12 02:35:20

标签: c

我试图为其他文件编写一个通用函数,以供其他文件重用,如下例所示,我有三个文件:

第一个文件: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即可。

4 个答案:

答案 0 :(得分:2)

您可以从包含有用功能的目标文件中构建自己的库,并将描述它们的标头存储在方便的位置。然后,您和您的同事使用标头进行编译,并将该库与使用这些功能中的任何一个的可执行文件链接。这与C编译器用来包含标准标头并自动链接到标准C库的通用机制几乎相同。

机制的差异取决于平台(Windows与Unix是主要区别,尽管Unix平台之间也有所不同)以及库的类型(静态档案库与动态链接/加载的库,也称为“共享对象或共享库)。

概括地说,对于具有静态库的Unix系统,您需要:

  • 使用(例如)libfile1.o编译库对象文件libfile2.ogcc -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