我有一个可执行文件utest.cpp
:
class Abc {
int i;
};
int main(int argc, const char** argv)
{
Abc* bla = new Abc();
return 0;
}
此可执行文件链接到库osa.lib
。 osa.lib
包含RTXConfCM.c
,其中包括标头RTX_CM_lib.h
。此标头定义函数void *__user_perthread_libspace (void)
。
尝试链接时,链接器失败(RTX_CM4.lib
是RTXConfCM.c
的依赖项):
armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "osa.lib" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Error: L6218E: Undefined symbol __rt_heap_descriptor (referred from malloc.o).
Error: L6218E: Undefined symbol __rt_new_handler_addr (referred from new.o).
当我从__user_perthread_libspace()
中删除函数RTX_CM_lib.h
并创建第二个版本osa-modified.lib
时,链接器错误消失了:
armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "osa-modified.lib" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Program Size: Code=6704 RO-data=324 RW-data=76 ZI-data=435948
我从原始rtxconfcm.o
中提取了单个目标文件osa.lib
并直接链接到该文件。与修改后的版本一样,我没有链接器错误:
armlink --cpu=Cortex-M4.fp "RTX_CM4.lib" "rtxconfcm.o" ".\keilout\objects\utest.o" -o .\KeilOut\Objects\test.axf
Program Size: Code=6704 RO-data=324 RW-data=76 ZI-data=435948
为什么链接只能用于目标文件,而不能用于包含目标文件的库?链接行为的区别在哪里?为什么符号__rt_heap_descriptor
和__rt_new_handler_addr
受已定义的__user_perthread_libspace()
和/或链接到.o
/ .lib
的影响?
我已经找到了Why does armlink treat libraries differently to objects,但是找不到我所遇到的行为的解释。我的库仅包含一个文件,链接器始终会发现该文件。
我正在使用ARM Compiler 5.06更新4(内部版本422)