2014-01-12 7 views
3

--with-fpmath=387을 사용하는 소스에서 gcc 4.x를 컴파일하려고 시도했지만이 오류가 발생합니다 : "Invalid --with-fpmath=387". 나는 CONFIGS에보고하고 (문서가 여전히 가능한 옵션으로 언급에도 불구하고)이 옵션을 지원하지 않는 것을 발견 : 나는에 대한 실행 파일을 제공해야하기 때문에 기본적으로gcc 4.x x87 FPU 수학 지원 안함?

case ${with_fpmath} in 
    avx) 
    tm_file="${tm_file} i386/avxmath.h" 
    ;; 
    sse) 
    tm_file="${tm_file} i386/ssemath.h" 
    ;; 
    *) 
    echo "Invalid --with-fpmath=$with_fpmath" 1>&2 
    exit 1 

을, 나는이 모든 일을 시작 오래된 대상 플랫폼 (실제로는 오래된 셀러론이지만 libstdC++에서 분명히 사용하는 SSE2 지침이없는 경우 DEFAULT). "잘못된 명령"메시지와 함께 libstdC++의 루틴을 복사하는 첫 번째 명령 (movq XMM0, ...)에서 실행 파일이 충돌합니다. 이 문제를 해결할 방법이 있습니까? 나는 기존의 코드 기반을 이식 할 수있는 꽤 최근의 g ++에 있어야한다.

일반 x87 명령어를 지원하도록 이전 빌드에서이 헤더/소스를 제공 할 수 있는지 궁금해서 SSE 명령어가 참조되지 않도록해야합니까?

업데이트 : 오브젝트 코드에 SSE2 명령어가있는 컴파일 된 libstdC++에 대해 얘기하고 있습니다. gcc 명령 줄 인수에 관한 질문이 아닙니다. 내 코드를 컴파일 할 때 gcc에 무엇을 공급하든 관계없이 이미 SSE2 지침이 내장 된 libstdC++와 링크됩니다.

GCC를 컴파일 할 때 ANY --with-fpmath 스위치를 사용하지 않는 것이 좋습니다. 나는 그것이 사실상 디폴트 값 (이 스위치에서 언급되지 않은 "387") 인 반면, 그것은 단지 sse 또는 avx만을 지원한다고 생각하는 configure 스크립트 switch 문에 대해 혼란스러워한다. 따라서 configure를 실행할 때 --with-fpmath를 사용하지 않도록하십시오. 그것없이 GCC를 재 컴파일했고 이제는 잘 동작한다.

감사합니다.

+0

솔루션을 찾았 으면이 질문을 닫거나 업데이트를 답으로 추가하고 해당 대답을 수락하십시오. –

답변

0

오브젝트 코드에 SSE2 명령어가있는 컴파일 된 libstdC++에 대한 질문 이었으므로 gcc 명령 줄 인수에 관한 질문이 아니 었습니다. 내 코드를 컴파일 할 때 gcc에 무엇을 공급하든 관계없이 이미 SSE2 지침이 내장 된 libstdC++와 링크됩니다.

진짜 대답은 GCC를 컴파일 할 때 --with-fpmath 스위치를 사용하지 않는 것입니다.나는 구성 스크립트 스위치 구문이 혼란 스러울 뿐이라고 생각한다. 실제로이 스위치에서 언급하지 않은 기본값 ("387")은 sse 또는 avx 만 지원한다. 따라서 configure를 실행할 때 --with-fpmath을 사용하지 마십시오. 그것없이 GCC를 재 컴파일했고 이제는 잘 동작한다.

2

특정 대상에 대한 코드를 생성하는 GCC 말할 인수는 CPU 원하는 특정 CPU입니다 -march =CPU입니다. 오래된 셀러론를 들어, 당신은 아마 -march=pentium2 또는

-march=pentium3은 FP가 별도로 CODEGEN, gcc를 사용 -mfpmath=의 최신 버전을 제어 할 - 귀하의 경우, 당신은 -mfpmath=387을 원한다.

이러한 및 많은 다른 사람은 모두, 나중에 프로그램에 연결합니다 (예 : 된 libstdC++ 등) 건물 라이브러리에 대한 그 플래그를 사용하기 위해서 gcc documentation

편집

에 설명되어 있습니다 적절한 플래그를 사용하도록 라이브러리의 빌드를 구성해야합니다. libstdC++는 g ++ 빌드의 일부로 빌드되므로 사용자 정의 빌드를 수행해야합니다. configure CXXFLAGS=-mfpmath=387을 사용하여 사물을 빌드하는 동안 사용할 추가 플래그를 설정할 수 있습니다.

+0

Chris, 고마워요.하지만 제가 언급 한 적절한 libstdC++ 컴파일은 앞서 언급 한 설정을 사용하여 나중에 코드를 생성 할 것입니다. 나는. 컴파일러에 제공 할 인수가 무엇이든 상관없이 _ALREADY_에 SSE2 명령어가있는 libstdC++와 연결됩니다. 따라서 g ++의 모든 종속성이 컴파일 될 때 초기 컴파일 단계에서이를 수행해야합니다. PS 대상 OS에 libstdC++가 설치되어 있지 않아서 동적 링크를 수행 할 수 없습니다. 정적으로 링크되어야합니다. – user1552175