c语言 - 何时将文件编译在一起以及何时使用库



搜索没有找到任何东西。

如果我有一个文件 main.c 和一对 aux.h 和 aux.c用于有用的函数,我什么时候应该一起编译 main.c 和 aux.c,什么时候应该用 aux 创建一个库(比如 aux.a)。

什么时候

我应该一起编译main.c和aux.c,什么时候应该用aux创建一个库(比如aux.a)。

当您有一个实用程序文件时,将其放入库中不会给您带来任何好处。只有当您有几个单独的文件,这些文件提供了一些常见但相关的功能时,才开始将它们放入存档(或共享)库中。

在构建程序时,您实际上有 3 个选择:

  1. 在一个步骤中编译并链接所有内容:

    gcc -o main main.c aux.c

  2. 写一个合适的Makefile。这将导致单独的编译:


    gcc -c main.cgcc -c aux.c
    gcc -o main main.o aux.o

  3. 编写使用该库的Makefile。这也将导致单独的编译,例如:


    gcc -c main.cgcc -c aux.car cru libaux.a aux.o

    gcc -o main main.o -laux

对于最小的玩具程序以外的任何东西,你至少应该做#2,因为这样做可以消除浪费在重新编译aux.cmain.c时没有更改的时间,同时仍然确保你的程序正确构建。

正如我所说,对单个文件执行 #3 根本不会买任何东西(您只需执行一些不必要的步骤)。

在以下情况下,建议使用库:

  1. 您构建了几个不同的程序,并且
  2. 您有几个相关的实用程序文件,其中一些(但不是全部)用于这些程序。

考虑您有prog1prog2prog3以及aux1.caux2.caux3.c实用程序文件的情况。假设prog1使用来自aux1.caux2.c的代码,prog2使用来自aux1.caux3.c的代码,prog3使用来自所有aux*.c文件的代码。

在这种情况下,使用案例 #2,您必须编写如下所示的Makefile

prog1: main1.o aux1.o aux2.o
prog2: main2.o aux1.o aux3.o
prog3: main3.o aux1.o aux2.o aux3.o

这(可能)是很多管理。

与使用案例 #3(即库)的Makefile进行比较:

prog1: main1.o libaux.a
prog2: main2.o libaux.a
prog3: main3.o libaux.a

更简单,不是吗?

还要考虑如果main1.c发生变化并开始使用aux3.o会发生什么。在情况 #2 中,您必须调整Makefile,但在情况 #3 中,您的Makefile已经正确了!

如果 aux.c 在许多其他地方经常使用,你可以考虑让它成为一个静态或动态库。 如果只是一次性运行的玩具程序,什么都不重要

最新更新