首页 > 解决方案 > 如果我链接了静态库,我应该在“BIG”包含文件中包含哪些文件?

问题描述

我使用 gcc 和统一构建。当我在编译和捆绑的“.a”文件中有一段代码时,我是否应该将“source.c”(或只是“source.c”的头文件)文件包含在“BIG”包含文件中我将包含在“main.c”中吗?gcc 会重新编译“source.c”文件吗?我应该如何编译我的 main.c 文件?我看到了两种方法:

像这样:

gcc -o main main.c -L./ -ltest

或者像这样:

gcc -o main main.c libtest.a

如果我在包含文件中包含“source.c”,它会成功编译,但我怎么知道“source.c”没有重新编译?

编辑:我有一个源文件(lib.c),其中包含所有内容。(test.h 和 test.c) 在 test.h 中有一个函数声明(TestCall),在 test.c 中有定义。Lib 编译成功。但是当我编译包含 test.h 并链接 libtest.a 的 main.c 时。Gcc 抛出“对 `TestCall' 的未定义引用”。

编辑2:

/*main.c*/
#include "test.h"

int main()
{
   TestCall();

   return 0;
}

/*test.h*/
#ifndef TEST_H
#define TEST_H

static void TestCall();

#endif

/*test.c*/
#include "test.h"

#include <stdio.h>

static void TestCall()
{
    printf("TestCall gets called!\n");
}

我尝试了一个命令:nm libtest.a

它说 TestCall 在那里:

test.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata
00000000 r .rdata$zzz
00000000 t .text
     U _puts
00000000 t _TestCall

标签: cgccstatic-linking

解决方案


如果您的静态库项目包含 2 个文件“source.h”和“source.c”,并且您从它们构建一个“libtest.a”,其内容如下:

gcc -o source.o -c source.c
ar libtest.a source.o

那么“source.c”显然已经编译了。所以你知道“source.c”没有被重新编译,因为“source.c”不包含在“libtest.a”中,只有编译输出“source.o”(目标文件)在你的“libtest.a”中。一个”。

使用 libtest.a 时,您需要做的就是链接 libtest.a(使用-ltest)并在包含路径中包含“source.h”。

PS:
1.) 永远不要包含 *.c 文件。
2.) 请不要使用“大”头文件。每个标题都应该有它的目的(并且那个目的不应该是“一个标题来统治它们”)


推荐阅读