在C中多次包含静态库
multiple inclusion of static library in C
我有libTimer.a
、lib2.a
、lib3.a
和申请代码。
lib2.a
通过链接 libTimer.a
(从 timer.o
创建)与其他目标文件 a.o
和 b.o
创建。
甚至 lib3.a
也是通过链接 libTimer.a
和其他目标文件创建的,例如 c.o
和 d.o
.
现在应用程序 main.o
与库 lib2.a
和 lib3.a
链接。
我知道通过这种方法不会增加应用程序的大小(不会发生多重包含)。我刚刚测试并发现通过链接库或添加单个源文件 a.o
、b.o
、c.o
、d.o
和 [=23 构建应用程序时,应用程序大小没有变化=].
但是以这种方式嵌套库有什么指导方针吗?
命令摘要如下:
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
Post 构建命令:
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
Post 构建:
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
Post 构建命令:
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
除了您的主应用程序之外,您显示为“linking 命令”的内容是不必要的。我真的很惊讶它不会抛出错误,因为你的库代码不应该包含 main()
.
创建静态库的命令是ar
命令(在你的例子中是交叉编译器avr-ar
命令)。他们唯一做的就是将库的所有目标文件放入存档文件 (*.a
)。
使用共享库,你会有一些依赖信息,所以共享库可以link对抗另一个共享库。对于 静态库 ,不存在这样的东西,它们只是目标文件的存档,在主应用程序的最后 linking 步骤中,您必须确保 link 所有必需的库。因此,liba
和 libb
都取决于您描述的 libTimer
,最后的 linking 步骤是错误的,它应该如下所示:
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.a
和 libb.a
- 您对您的问题与名为 lib2.a
和 lib3.a
的库有些混淆。
需要注意的重要事项:在您的 linking 命令中,始终在 依赖项 之前列出库和目标文件。 linker 通过维护 未解析的符号 来工作,并且只能从稍后在命令行中出现的库和目标文件中删除它们。
我有libTimer.a
、lib2.a
、lib3.a
和申请代码。
lib2.a
通过链接 libTimer.a
(从 timer.o
创建)与其他目标文件 a.o
和 b.o
创建。
甚至 lib3.a
也是通过链接 libTimer.a
和其他目标文件创建的,例如 c.o
和 d.o
.
现在应用程序 main.o
与库 lib2.a
和 lib3.a
链接。
我知道通过这种方法不会增加应用程序的大小(不会发生多重包含)。我刚刚测试并发现通过链接库或添加单个源文件 a.o
、b.o
、c.o
、d.o
和 [=23 构建应用程序时,应用程序大小没有变化=].
但是以这种方式嵌套库有什么指导方针吗?
命令摘要如下:
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
Post 构建命令:
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
Post 构建:
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
Post 构建命令:
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
除了您的主应用程序之外,您显示为“linking 命令”的内容是不必要的。我真的很惊讶它不会抛出错误,因为你的库代码不应该包含 main()
.
创建静态库的命令是ar
命令(在你的例子中是交叉编译器avr-ar
命令)。他们唯一做的就是将库的所有目标文件放入存档文件 (*.a
)。
使用共享库,你会有一些依赖信息,所以共享库可以link对抗另一个共享库。对于 静态库 ,不存在这样的东西,它们只是目标文件的存档,在主应用程序的最后 linking 步骤中,您必须确保 link 所有必需的库。因此,liba
和 libb
都取决于您描述的 libTimer
,最后的 linking 步骤是错误的,它应该如下所示:
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.a
和 libb.a
- 您对您的问题与名为 lib2.a
和 lib3.a
的库有些混淆。
需要注意的重要事项:在您的 linking 命令中,始终在 依赖项 之前列出库和目标文件。 linker 通过维护 未解析的符号 来工作,并且只能从稍后在命令行中出现的库和目标文件中删除它们。