c - 如果我链接了静态库,我应该在“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
解决方案
如果您的静态库项目包含 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.) 请不要使用“大”头文件。每个标题都应该有它的目的(并且那个目的不应该是“一个标题来统治它们”)
推荐阅读
- apache-spark - Spark join:对同一分区中的特定列具有相同值的记录分组
- python - 是否可以使用单独的终端打包 python 应用程序?
- jquery - 附加到最接近的 - 对于每个:重复的模式
- nested - Bootstrap flex 嵌套行并排定位,而不是一个在另一个下
- google-cloud-ml - 在 AI Platform 中部署 PyTorch 模型
- java - 如何在外部 Tomcat 服务器中运行 WAR 文件的设置代码
- ios - 为什么我的 @State 对象不保留其价值?
- python - Pandas 用 1 替换数据帧的所有非 NaN 条目,不理会 NaN
- cookies - 将 cookie 添加到 GET 请求未显示
- javascript - 在其他组件中渲染组件的一部分