使用floorf()函数时无法链接Embarcadero XE4项目

时间:2014-12-31 23:14:40

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

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我使用BDS2006,所以这可能没有用,但是:

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