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

时间:2017-01-02 23:10:34

标签: c linker

搜索没有改变任何内容。

如果我有一个文件main.c和一对aux.h和aux.c用于有用的功能,我什么时候应该只编译main.c和aux.c以及何时应该从aux中创建一个库(如aux .a)中。

2 个答案:

答案 0 :(得分:1)

如果在许多其他地方频繁使用aux.c,您可以考虑将其设为静态或动态库。 如果它只是一次性玩具程序,那么无关紧要

答案 1 :(得分:1)

  

何时我应该将main.c和aux.c一起编译,何时应该从aux(如aux.a)创建一个库。

当您拥有单个实用程序文件时,将其放入库中会为您购买 nothing 。只有当你有一些单独的文件时,它才会提供一些常见但相关的功能,将它们放入存档(或共享)库中才有意义。

在构建程序时,您实际上有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

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

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

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

    1. 您构建了几个不同的程序,
    2. 您有几个相关的实用程序文件,其中一些(但不是全部)在这些程序中使用。
    3. 考虑您拥有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已经正确!