1

我需要使用 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。我需要什么才能让这个工作?我真的需要使用这个标准的数学函数。

4

2 回答 2

0

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

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

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

于 2015-01-02T10:18:52.103 回答
0

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

gcc:为什么需要 -lm 标志来链接数学库?

于 2014-12-31T23:20:02.173 回答