【问题标题】:Unable to link Embarcadero XE4 project when using floorf() function使用 floorf() 函数时无法链接 Embarcadero XE4 项目
【发布时间】:2015-02-27 21:36:05
【问题描述】:

我需要使用 Math.h 中定义的 floorf() 函数,虽然我可以编译在我的 XE4 项目中成功使用的模块,但在链接时收到此错误:

[ilink32 Error] Error: Unresolved external '_floorf' referenced from <myfilename>.OBJ
[ilink32 Error] Error: Unable to perform link

这是没有意义的——当我控制点击 floorf() 函数时,编译器显然知道函数的声明位置,因为它会打开 Math.h。我已经在 .cpp 文件中包含了#include。我需要什么才能让这个工作?我真的需要使用这个标准的数学函数。

【问题讨论】:

  • 添加头文件只会让编译器知道函数的原型;它没有告诉链接器在哪里可以找到它。您还需要包含数学库。
  • 您是否包含了包含“floorf”函数的库(不是头文件)。顺便说一句:函数名称是 'floorf' 而不是 '_floorf'
  • 我无法弄清楚要包含的库的名称是什么。我已经尝试过 math.lib 和 libm.lib 两者显然都不存在。当 lib 文件的名称与标头不同且从未在任何地方记录时,我应该如何神奇地知道它的名称?

标签: c++ c math linker-errors c++builder-xe4


【解决方案1】:

在某些编译器中默认不启用与数学库的链接。

gcc: why the -lm flag is needed to link the math library?

【讨论】:

  • 了解,但我从未听说过 Embarcadero C++ Builder(任何版本)有这种行为。如果有我需要使用的设置来启用它,我不知道它是什么。
  • @Isaac borland/embarcadero 编译器会在您包含 math.h/math.hpp 时添加与数学的链接,无需切换。它通常由头文件中的#pragma link "blablabla.obj" 行完成...
【解决方案2】:

我使用 BDS2006,所以这可能无济于事:

  1. 尝试使用floor() 而不是floorf()
    • 如果您有歧义问题,请使用float(floor(float(x)));
  2. 尝试包含而不是或其他方式,看看是否有帮助
  3. 您使用任何命名空间吗? (尝试使用::floor()
  4. 你不是忘了一些;,{,},};吗?特别是在struct/class/namespace
  5. 你使用#defines 吗?
    • borland/embarcadero 有时在定义中的代码存在问题
    • 它很少会错误地编译它,因此代码在编写时无法正常工作
    • 确实见过几次,通常交换/插入一些行(甚至是空行)会有所帮助
  6. 你在哪里使用 floorf 函数(cpp 文件或单位或表格)?
    • 如果您将单元文件添加到项目中(使用您自己的东西而不是窗口/窗体代码)
    • 然后假定是 VCL/机器生成的东西,例如 Form not standard C/C++ file
    • 它的编译/链接方式不同
    • 如果是这种情况,请从项目中删除文件
    • 并将其添加到需要它的 Form cpp/h 文件之一中
    • 我在 BCB5、BCB6、BDS2006 中看到了这种行为
  7. 您是否使用了一些与数学内部编译标记冲突的#defines?
    • 可以在内部使用一些定义来启用//禁用数学中的部分代码
    • 因此,如果您在数学包含之前定义相同的内容,您可能会弄乱它
    • 不要使用像_math,_floor...这样的令牌
  8. 如何命名自己的函数
    • 如果它们与 VCL 名称发生冲突,那么奇怪的事情就会开始发生
    • 典型的是自己的Draw()函数与内部TForm::Draw发生冲突
    • 没有报告错误,但有时代码不起作用(即使调用操作数不同)
    • 上次看到这个是在 BCB6 上
    • 只需将它们重命名为 draw() 就可以了,除非你绑定了一些命名方案

我敢打赌,第 6 点在我的教学时间里看过很多次

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 2014-06-07
    • 2020-09-19
    • 2013-03-14
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多