2017-01-18 15 views
0

Я хотел бы использовать math.h в C++ Builder 10.1.2.Ошибка связи с "math.h" - Какая опция рассказать компоновщику для связи с ним?

К сожалению, при попытке вызвать одну из функций math.h есть ошибка компоновщика. Я уже знаю, что (по историческим причинам) линкер должен быть явно установлен для ссылки на использование математики lib. See here.

В gcc это можно сделать с помощью флага -lm.

Но что я должен войти в C++ Builder в Опции проекта =>C++ Linker =>Дополнительные параметры поле, чтобы сделать эту работу?

EDIT:

Так вот пример: Создать новый проект VCL и изменить код Form1 подобное:

//--------------------------------------------------------------------------- 

#include <vcl.h> 
#pragma hdrstop 

#include "Unit1.h" 

#include <math.h> 
//-------------------------------------------------------------------------- - 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
{ 
    float a = floorf(0.0f); 
} 
//--------------------------------------------------------------------------- 

Это даст вам сообщение об ошибке компоновщика

[ilink32 Error] Error: Unresolved external '_floorf' referenced by C:\USERS\FLKO\DOCUMENTS\EMBARCADERO\STUDIO\PROJECTS\WIN32\DEBUG\UNIT1.OBJ 

Так что мне нужно рассказать компоновщику ссылку с math lib.

Но как?

+1

Так в чем же ошибка? Неразрешенный символ? Несколько определенных символов? –

+0

Некоторое время, но вы использовали «добавить к проекту», измените фильтр поиска на * .lib, выследите библиотеку и нажмите «ОК». – user4581301

ответ

1

Эта проблема не связана со статической/динамической связью, но с изменением имени. Если вы внимательно осмотрите math.h, вы обнаружите разницу между Win64 и Win32 деклараций для функции пола:

extern "C++" { 
... 
#if defined(_WIN64) 
inline float floor(float __x) { return floorf(__x); } 
... 
#else 
... 
inline float floor(float __x) { return (float)floor((double)__x); } 
... 

Чтобы сделать длинную историю короткой, попытайтесь построить ваш проект на платформе Win64: floorf будут правильно связаны. Это не сработает для Win32. Мое предложение состоит в том, чтобы использовать этаж вместо floorf. Он будет работать на обеих платформах.

Редактировать: На самом деле, функция floorf не определена для Win32 в библиотеке stdb Embarcadero. Если вы хотите использовать некоторую стороннюю библиотеку std, вы должны включить в нее соответствующий заголовок (не один из Embarcadero) и библиотеку ссылок (#pragma link). Если библиотека скомпилирована с помощью gcc/msvc, вы должны преобразовать библиотеку в формат omf.

 Смежные вопросы

  • Нет связанных вопросов^_^