2017-01-18 15 views
0

C++ Builder 10.1.2에서 math.h을 사용하고 싶습니다."math.h"와의 링크 오류 - 링커에 링크 할 수있는 옵션은 무엇입니까?

불행히도 math.h의 기능 중 하나를 호출하려고하면 링커 오류가 발생합니다. 내가 이미 알고있는 것은, (역사적인 이유로) 링커는 수학 lib를 사용하도록 링크하도록 명시 적으로 설정되어야한다는 것입니다. See here.

gcc 이것은 -lm 플래그를 통해 수행 할 수 있습니다.

그러나 나는이 작품을 만들기 위해 필드 =>C++ 링커 =>고급 옵션 프로젝트 옵션에서 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에서는 작동하지 않습니다. 제 제안은 floorf 대신 floor을 사용하는 것입니다. 두 플랫폼 모두에서 작동합니다.

편집 : 사실, floorf 함수는 Embarcadero std 라이브러리에서 Win32 용으로 정의되지 않았습니다. 타사 std 라이브러리를 사용하려면 적절한 헤더 (Embarcadero가 아닌)와 링크 라이브러리 (#pragma link)를 정적으로 포함시켜야합니다. 라이브러리가 gcc/msvc로 컴파일 된 경우 라이브러리를 omf 형식으로 변환해야합니다.