使用GCC的另一个目录中的静态库和头文件

时间:2013-04-09 15:36:47

标签: c gcc header-files include-path

我正在寻找here如何使用GCC做静态库,并且解释非常明确(鄙视我必须重写阶乘函数的事实):我有一个函数(fact.c),标题功能(fact.h)和主函数(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 <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文件都在主目录中。

的main.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

2 个答案:

答案 0 :(得分:3)

这是你的答案,

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

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

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

答案 1 :(得分:2)

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

gcc -I/include fact.c

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