使用GCC的其他目录中的静态库和标头

我在这里看看如何使用GCC做静态库,并且解释非常明确(鄙视我必须重写阶乘函数):我有一个函数(fact.c),函数的头部(fact.h) )和main函数(main.c),所有这些都在我的主目录中。

fact.h

int fact (int); 

fact.c

 int fact (int f) { if ( f == 0 ) return 1; else return (f * fact ( f - 1 )); } 

main.c中

 #include  #include "fact.h" int main(int argc, char *argv[]) { printf("%d\n", fact(3)); return 0; } 

所以我先生成了目标文件(阶段1)……

 $ gcc -c fact.c -o fact.o 

…然后生成静态库(阶段2)……

 $ ar rcs libfact.a fact.o 

…稍后做静态库链接过程(第3阶段)……

 $ gcc -static main.c -L. -lfact -o fact 

……最后运行程序(第4阶段和最后阶段)

 $ ./fact 

我的问题如下。 假设我的程序太大了,除了将标题放在头目录(/include/fact.h)中之外我别无选择,静态库也将在另一个目录(/lib/libfact.a)中。 在这种情况下,该程序的编译和/或代码将如何变化?

编辑/解决问题 :首先,更正了main.c,以便在另一个名为include的目录中包含一个标题。 请记住,在这种情况下,两个.c文件都在主目录中。

main.c中

 #include  #include "include/fact.h" int main(int argc, char *argv[]) { printf("%d\n", fact(3)); return 0; } 

其次,要在另一个目录中生成静态库(阶段2),这就是我所做的:

 $ ar rcs lib/libfact.a fact.o 

这是你的答案,

$ gcc -static main.c -L。 -lfact -o fact

-L将目录添加到要搜索-l的目录列表中

它在你给的链接中。 如果你正确地设置了搜索方向和低搜索范围,那就不会有问题了。 否则它不会编译代码。 因为代码不知道标题在哪里。

您可以添加-I以指定包含路径。

 gcc -I/include fact.c gcc -I/include -static main.c -L/lib -lfact -o fact_main