2017-01-18 104 views
0

我想在C++ Builder 10.1.2中使用math.h將錯誤與「math.h」鏈接 - 告訴鏈接器鏈接的選項是什麼?

不幸的是,當我嘗試調用math.h的函數之一時出現鏈接器錯誤。 我已經知道的是,(由於歷史原因)鏈接器必須顯式設置爲使用鏈接來使用數據庫數據庫庫。 See here

gcc這可以通過-lm標誌完成。

但是我對C++ Builder中的項目選項 =>C++鏈接器 =>高級選項進入領域,使這項工作?

編輯:

所以這裏有一個例子: 創建一個新的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。我的建議是使用floor而不是floorf。它將在兩個平臺上工作。

編輯:實際上,Embarcadero std庫中沒有爲Win32定義floorf函數。如果你想使用一些第三方std庫,你必須靜態地包含適當的頭(不是來自Embarcadero的頭)和鏈接庫(#pragma鏈接)。如果庫使用gcc/msvc編譯,則必須將庫轉換爲omf格式。