1

我在这里看如何使用 GCC 做静态库,解释很清楚(尽管我不得不重写阶乘函数):我有一个函数(fact.c),函数的头文件(fact.h ) 和 main 函数 (main.c),它们都在我的主目录中。

事实.h

int fact (int);

事实.c

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

主程序

#include <stdio.h>
#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 文件都在主目录中。

主程序

#include <stdio.h>
#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
4

2 回答 2

3

这是你的答案,

$ gcc -static main.c -L。-lfact -o 事实

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

它在您提供的链接中。如果您正确放置搜索方向和低搜索范围,则不会有问题。否则它不会编译代码。因为代码不知道标题在哪里。

于 2013-04-09T15:41:56.363 回答
2

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

gcc -I/include fact.c

gcc -I/include -static main.c -L/lib -lfact -o fact_main
于 2013-04-09T15:56:20.867 回答