【问题标题】:Static libraries and headers in another directories with GCC使用 GCC 在另一个目录中的静态库和头文件
【发布时间】:2013-04-09 15:36:47
【问题描述】:

我在看herehow to do static libraries using 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 ));
}

ma​​in.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 文件都在主目录中。

ma​​in.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

【问题讨论】:

    标签: c gcc header-files include-path


    【解决方案1】:

    这是你的答案,

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

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

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

    【讨论】:

    • 我用头目录(/include/fact.h)中的头文件尝试了它,但它在主程序中给了我一个错误,说文件 fact.h 不存在。可能只是编译没有问题,可能我要在主程序的include里面改点东西。
    • 请检查您可能写错的目录。 c:// 或 c:/ 或 C:// 变体可能有问题。并尝试给出除搜索范围之外的标题的确切位置。 #include "fact.h" 这意味着它靠近主程序。你应该使用 #include 试试这个。
    • 我试过了,但问题依旧:主程序出错提示fact.h文件不存在。
    • 我解决了这个问题。您在链接上发布的命令起作用了。问题不在于编译,而在于代码。事实上,我用#include "include/fact.h" 更正了包含。无论如何,谢谢 =)
    【解决方案2】:

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

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

    【讨论】:

    • 同上问题:主程序出错提示fact.h文件不存在。
    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多