Ash*_*can 2 c c++ linker gcc stm32
参考这个问题:
在一个小型微型嵌入式项目中,我发现我的编译代码大小远大于预期.事实证明这是因为我包含了使用assert()的代码.在包含的代码中使用assert是合适的,但导致我的编译代码大小几乎翻倍.
问题不在于if /何时应该使用assert,而是编译器/链接器如何决定包含assert的所有必要开销.
我在另一篇文章中的原始问题:
如果有人能够向我解释当调用assert时gcc如何决定包含库函数会有所帮助?我看到assert.h声明了一个外部函数__assert_func.链接器如何知道从库中引用它而不是仅仅说"未定义引用__asert_func"?
在配置工具链时,作者会决定默认情况下应链接到哪些库.
这通常包括运行时启动/初始化代码和一个名为库的库libc,其中包含C标准的实现,以及作者认为相关的任何其他代码(例如libc也可能实现Posix,任何自定义板特定功能等)和嵌入式目标链接到为目标实现RTOS的库并不罕见.
您可以使用-nodefaultlibsgcc标志在链接阶段省略这些默认库.
在assert()的情况下,它是标准的C宏/函数,通常在libc中实现.assert()可能会打印到stdout它失败,所以使用assert()可以拉入实现FILE*处理/缓冲,printf等的整个stdio工具,所有这些都是在libc中实现的.
如果您运行gcc -v链接阶段,则可以默认查看gcc链接到的库.