搜索没有改变任何内容。
如果我有一个文件main.c和一对aux.h和aux.c用于有用的功能,我什么时候应该只编译main.c和aux.c以及何时应该从aux中创建一个库(如aux .a)中。
答案 0 :(得分:1)
如果在许多其他地方频繁使用aux.c,您可以考虑将其设为静态或动态库。 如果它只是一次性玩具程序,那么无关紧要
答案 1 :(得分:1)
何时我应该将main.c和aux.c一起编译,何时应该从aux(如aux.a)创建一个库。
当您拥有单个实用程序文件时,将其放入库中会为您购买 nothing 。只有当你有一些单独的文件时,它才会提供一些常见但相关的功能,将它们放入存档(或共享)库中才有意义。
在构建程序时,您实际上有3个选择:
一步编译并链接所有内容:
gcc -o main main.c aux.c
写一个合适的Makefile
。这将导致单独的编译:
gcc -c main.c
gcc -c aux.c
gcc -o main main.o aux.o
写一个使用该库的Makefile
。这也将导致单独的编译,如:
gcc -c main.c
gcc -c aux.c
ar cru libaux.a aux.o
gcc -o main main.o -laux
对于除最小玩具程序以外的任何东西,你至少应该做#2,因为这样做可以消除浪费时间重新编译aux.c
或main.c
当没有改变时,同时仍然确保你的程序构建正确。
正如我所说,对单个文件执行#3时根本不会购买任何内容(只需执行一些不必要的步骤)。
建议在以下情况下使用库:
考虑您拥有prog1
,prog2
和prog3
以及aux1.c
,aux2.c
和aux3.c
实用程序文件的情况。假设prog1
使用aux1.c
和aux2.c
中的代码,prog2
使用aux1.c
和aux3.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
已经正确!