我正在使用一个嵌入式ARM设备,并正在编译程序。我想最大限度地减少内存的使用。
我使用GCC-ARM工具包来构建程序。然而在林肯身上,我得到了错误:/选项/gcc-臂-无-eabi-10.3-2021.10/bin/../lib/gcc/臂-无-eabi/10.3.1/../臂-无-eabi/bin/ld:/opt/gcc-arm-none-eabi-10.3-2021.10/bin/../lib/gcc/arm-none-eabi/10.3.1/../arm-none-eabi/lib/thumb/v7 e-m +fp/hard/libstdc++.a(数学_存根_长_双精度.o):in function acosl': math_stubs_long_double.cc:(.text.acosl+0x0): undefined reference to
acos '这不仅出现在acos中,同样的错误也会在所有数学函数中重复出现。因此,我不得不通过**-lm**标志链接数学库。我使用的代码分布在多个文件中(这就是为什么我不能将其粘贴在这里),我已经检查了所有包含的头文件,没有发现任何数学库函数的引用。由于内存限制,我希望删除此依赖项。有没有办法做到这一点?
1条答案
按热度按时间u3r8eeie1#
Map文件还显示了包含库的原因。比如说,
字符串
通过与
-lm
链接并生成Map文件,您可以自己找到答案。在本例中,您使用的是libstdc++。使用像
std::cout
等功能可以拉入浮点格式代码。这段文字是在暗示。libstdc++.a(math_stubs_long_double.o):在函数acosl’中:math_stubs_long_double.cc:(.text.acosl+0x0):对acos的未定义引用
您需要查看一个Map文件,以了解为什么包含'math_stubs_long_double.cc',并跟踪链,直到找到从**libstdc++到源代码的调用。
--gc-sections
和其它技术可以减少开销。然而,这是一个相当广泛的主题。存在各种专门的(和有限的)C库来尝试最小化内存占用,通常以牺牲功能和运行时性能为代价。我不太清楚libstdc++**是最低功能的。
另请参阅:Undefined reference to cxa..