gpt4 book ai didi

c - 在C中多次包含静态库

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:41 26 4
gpt4 key购买 nike

我有libTimer.alib2.alib3.a 和应用程序代码。lib2.a 通过将 libTimer.a(从 timer.o 创建)与其他目标文件 a.ob.o。甚至 lib3.a 也是通过链接 libTimer.a 和其他目标文件如 c.od.o 创建的。

现在应用程序 main.o 链接到库 lib2.alib3.a。我知道通过这种方法不会增加应用程序的大小(不会发生多重包含)。我刚刚测试并发现,当通过链接库或通过添加单个源文件 a.ob.oc.o 构建应用程序时,应用程序大小没有变化, d.otimer.o

但是以这种方式嵌套库有什么指导方针吗?

下面是命令摘要:

libTimer.a

编译命令:

avr-gcc.exe -Os -Wextra -Wall -mmcu=atmega328p -std=gnu99 \
-fshort-enums -ffunction-sections -fdata-sections -DF_CPU=16000000UL \
-g -Os -Wmain -Wextra -Wall -c CL_Timer.c -o Debug\CL_Timer.o

链接命令:

avr-g++.exe -o Debug\Timer.elf Debug\Timer.o -mmcu=atmega328p \
-Wl,-Map=Debug\timer.map -Wl,--gc-sections

构建后命令:

avr-ar rcs libTimer.a Debug\timer.o
ranlib libTimer.a

Lib2.a

链接命令:

avr-g++.exe -o Debug\library2.elf Debug\a.o Debug\b.o -mmcu=atmega328p \
-Wl,-Map=Debug\library2.map -Wl,--gc-sections .\libTimer.a

后期构建:

avr-ar rcs lib2.a Debug\a.o Debug\b.o
ranlib lib2.a

lib3.a

链接命令:

avr-g++.exe -o Debug\library3.elf Debug\c.o Debug\c.o -mmcu=atmega328p \
-Wl,-Map=Debug\library3.map -Wl,--gc-sections .\libTimer.a

构建后命令:

avr-ar rcs lib3.a Debug\c.o Debug\d.o
ranlib lib3.a

主应用链接:

avr-g++.exe -o Debug\main.elf Debug\main.o -mmcu=atmega328p \
-Wl,-Map=Debug\main.map -Wl,--gc-sections .\liba.a .\liba.b

最佳答案

除了您的主应用程序之外,您显示为“链接命令”的内容是不必要的。我真的很惊讶它不会抛出错误,因为你的库代码不应该包含 main() .

创建静态库的命令是ar命令(在你的例子中是交叉编译器 avr-ar 命令)。他们唯一做的就是将库的所有目标文件放入存档文件 (*.a)。

使用共享库,您将获得一些依赖信息,因此共享库 可以链接到另一个共享库。对于静态库,不存在这样的东西,它们只是目标文件的存档,在主应用程序的最后链接步骤中,您必须确保链接所有必需的库。因此,用libalibb都取决于 libTimer正如你所描述的,最后的链接步骤是错误的,它应该是这样的:

avr-g++.exe -o Debug\main.elf Debug\main.o -mmcu=atmega328p \
-Wl,-Map=Debug\main.map -Wl,--gc-sections .\liba.a .\libb.a .\libTimer.a

这假设它们实际上被命名为 liba.alibb.a -- 你对名为 lib2.a 的库的问题有些困惑和 lib3.a

需要注意的重要事项:在您的链接命令中,始终在它们的依赖项之前列出库和目标文件。链接器通过维护未解析的符号来工作,并且只能从稍后在命令行中出现的库和目标文件中删除它们。

关于c - 在C中多次包含静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45262102/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com