c - 何时一起编译文件以及何时使用库

标签 c linker

搜索没有找到任何结果。

如果我有一个文件 main.c 和一对 aux.h 和 aux.c 来实现有用的功能,那么我什么时候应该将 main.c 和 aux.c 一起编译,什么时候应该用 aux 创建一个库(例如 aux .a).

最佳答案

when should I just compile main.c and aux.c together and when should I make a library out of aux (like aux.a).

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

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

  1. 一步即可将所有内容编译并链接在一起:

    gcc -o main main.c aux.c

  2. 编写正确的Makefile。这将导致单独编译:

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

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

    gcc -c main.c
    gcc -c aux.c
    ar cru libaux.a aux.o
    gcc -o main main.o -laux

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

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

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

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

考虑一下您有 prog1prog2prog3 以及 aux1.c 的情况>aux2.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 已经正确了!

关于c - 何时一起编译文件以及何时使用库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41434352/

相关文章:

xcode - 使用 swift 为 Xcode 项目自定义链接器

c - 对于简单的操作怎么想到位操作呢?

c - 在 C 中打印和删除队列

c - 在函数内重新分配数组

c - 仅使用按位运算符以二进制形式执行算术运算

dynamic - 如何区分 .data.rel 部分中的可重定位符号和不可重定位符号

c - hiredis c 套接字

c - 如何在 lib 错误中获取未解析的外部?

c++ - 我如何学习包含和链接到库?

c - 如何将 -libm 传递给 MPICC? libimf.so : warning: feupdateenv is not implemented and will always fail