Невозможно связать проект Embarcadero XE4 при использовании функции floorf ()

Мне нужно использовать функцию floorf (), определенную в Math.h, и хотя я могу скомпилировать модуль, где он успешно используется в моем проекте XE4, я получаю эту ошибку при компоновке:

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

Это не имеет смысла — компилятор, очевидно, знает, где объявлена ​​функция, так как он открывает Math.h, когда я нажимаю клавишу control на функции floorf (). и я включил #include в файл .cpp. Что мне нужно, чтобы это работало? Мне действительно нужно использовать эту стандартную математическую функцию.

1

Решение

Связывание с библиотекой математики не включено по умолчанию в некоторых компиляторах.

gcc: почему флаг -lm необходим для связи математической библиотеки?

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, а не стандартный файл C / C ++.
    • и это скомпилировано / связано по-разному
    • если это так, удалите файл из проекта
    • и добавьте include этого файла в один из файлов Form cpp / h, где это необходимо
    • Я видел это поведение в BCB5, BCB6, BDS2006
  7. ты используешь немного #defineЭто противоречит математическим жетонам внутренней компиляции?
    • некоторые определения могут быть использованы внутри, чтобы включить // отключить части кода внутри математики
    • так что если вы определите то же самое до математического включения, вы можете связываться с ним
    • не используйте токены как _math,_floor
  8. как вы называете свои собственные функции
    • если они сталкиваются с VCL имена то странные вещи начинают происходить
    • типичное является собственным Draw() функции со столкновением с внутренним TForm::Draw
    • об ошибке не сообщается, но иногда код не работает (даже если операнды вызова не совпадают)
    • последний раз видел это на BCB6
    • просто переименуйте их в draw() и вы будете в порядке, если вы не привязаны к какой-либо схеме именования

Я держал пари, что точка 6 видела это много-много раз назад во время моего обучения

0