2016-09-14 7 views
0

-fPIC 부족으로 errors in our CMake makefiles을 포착합니다. 그녀는 ci20 MIPS dev에 보드에서 하나 :CMakeList.txt에서 32 비트 x86 프로세서를 감지합니까?

... 
[ 92%] Built target cryptopp-object 
Scanning dependencies of target cryptopp-shared 
Scanning dependencies of target cryptopp-static 
Linking CXX static library libcryptopp.a 
Linking CXX shared library libcryptopp.so 
/usr/bin/ld: CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: relocation R_MIPS_HI16 against 
`a local symbol' can not be used when making a shared object; recompile with -fPIC 
CMakeFiles/cryptopp-object.dir/cryptlib.cpp.o: could not read symbols: Bad value 
collect2: ld returned 1 exit status 

프로젝트의 정책이 압력을 등록하기 때문에 32 비트 x86을 제외한 모든 곳에서 우리 PIC이다. 즉 x86_64, ARM-32, Aarch32, Aarch64, MIPS, MIPS64, UltraSparc 등은 PIC를 얻습니다.

대상 프로세서가 CMAKE_SYSTEM_PROCESSOR으로 제공됩니다. 내가 겪고있는 문제는 문서에서 값을 말하지 않기 때문에 "32 비트가 아닌 x86"테스트를 작성하는 방법을 알 수 없습니다.

CMakeList.txt에서 32 비트 x86 프로세서를 어떻게 검색합니까?

CMake가 CMAKE_SYSTEM_PROCESSOR을 설정하는 포괄적 인 프로세서 목록을보고 싶습니다. 누구든지 목록을 가지고 있다면, 그것을 제공하는 것이 좋을 것입니다.

답변

1

아마도 저는 컴파일러 주위에 무언가를 만들 것입니다.

기존 변수를 사용하는 근사치가/모듈은 다음과 같습니다 내가 한 일을 한마디로

include(TestBigEndian) 

if (NOT WIN32) 
    TEST_BIG_ENDIAN(_bigendian) 
    if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_bigendian)) 
     message(
      STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC} " 
        "for machine ${CMAKE_HOST_SYSTEM_PROCESSOR}" 
     ) 
     set(CMAKE_POSITION_INDEPENDENT_CODE 1) 
    endif() 
endif() 

:

  • WIN32는 64 비트 Windows 컴파일러 유효/환경
  • CMAKE_SIZEOF_VOID_P GREATER 4 "32 비트 이상"을 확인하십시오.
  • 마지막으로 가장 큰 가정은 모든 리틀 엔디 언 프로세서 인텔/AMD로

-fPIC 내가 더 정확한 방법은 미리 정의 된 매크로 테스트 주위에 뭔가를 구축하는 것입니다 인정 설정 CMAKE_POSITION_INDEPENDENT_CODE 더 일반적인 사용을 기반으로.

편집 : 추가 "미리 정의 된 매크로가 확인"대체 여기

사전 정의 된 매크로에 대한보다 정확한 검사는 다음과 같습니다

include(CheckCXXSourceCompiles) 

if (CMAKE_CXX_COMPILE_OPTIONS_PIC) 
    set(
     _preDefMacrosX86 
      __i386 __i386__ __i486__ __i586__ __i686__  
      _M_I86 _M_IX86 __X86__ _X86_ __THW_INTEL__ 
      __I86__ __INTEL__ __386 
    ) 
    set(_code "void main() {}") 
    foreach(_macro IN LISTS _preDefMacrosX86) 
     set(
      _code 
      "${_code}\n\#ifdef ${_macro}\n\#error ${_macro} is defined\n\#endif" 
     ) 
    endforeach() 
    CHECK_CXX_SOURCE_COMPILES("${_code}" _canCompileX86DoesFailCheck) 

    if((CMAKE_SIZEOF_VOID_P GREATER 4) OR (_canCompileX86DoesFailCheck)) 
     message(STATUS "Setting ${CMAKE_CXX_COMPILE_OPTIONS_PIC}") 
     set(CMAKE_POSITION_INDEPENDENT_CODE 1) 
    endif() 
endif() 

참조

+0

다시 한 번 감사드립니다. 나는'CMAKE_POSITION_INDEPENDENT_CODE'에 대해 몰랐다. 내가 추가 할게. – jww

+0

* "모든 리틀 엔디안 프로세서를 인텔 기반으로 사용하십시오."* - 다소 느슨해 질 필요가 있습니다. 내가 사용하는 모든 ARM 프로세서는 LE입니다. 코너 케이스는 예전 Apple G5의 PowerPC라고 할 수 있습니다. 그것의 BE, 그리고 그것을 필요로 -fPIC (IIRC). 나는 라이브러리의 BE 빌드를 테스트하기 위해 지하실에있는 G5 중 하나를 가지고 있습니다. Verizon이 라우터에서 포트 포워딩을 수정하면 (https://www.google.com/search?q=verizon+prt+forwarding+broke) 원하는 경우 원격 SSH 액세스를 제공 할 수 있습니다. PF는 작동하지만, VZ는 4XX 시리즈 펌웨어 업데이트에서 파기했습니다. 당신은 모두 당신이 좋아하는 CMake를 테스트 할 수 있습니다 :) – jww

+0

@jww 그래, 나는 더 잘 알려야했다. 그 죄송합니다. 훨씬 더 정확한 "미리 정의 된 x86 매크로 검사"버전을 추가했습니다. 그렇게해야합니다. – Florian

0

저는 이것이 Windows를 제외한 거의 모든 곳에서 탐지를 수행한다고 생각합니다. Windows는 -fPIC을 소비하지 않으므로 문제가되지 않습니다. 조각들은 3 개의 Stack Overflow 해답들로 함께 붙어 있습니다.

# Stop hiding the damn output... 
set(CMAKE_VERBOSE_MAKEFILE on) 

# Enable PIC for all targets except Windows and 32-bit x86 
if (NOT (WINDOWS OR WINDOWS_STORE OR WINDOWS_PHONE)) 

    set (UNAME_CMD "uname") 
    set (UNAME_ARG "-m") 
    execute_process(COMMAND ${UNAME_CMD} ${UNAME_ARG} 
     WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} 
     RESULT_VARIABLE UNAME_RESULT 
     OUTPUT_VARIABLE UNAME_MACHINE) 

    # Use Regex; match i386, i486, i586 and i686 
    IF (NOT (${UNAME_MACHINE} MATCHES "i.86")) 
     # message(STATUS "Setting -fPIC for machine ${UNAME_MACHINE}") 
     if (CMAKE_VERSION VERSION_LESS 2.8.12) 
      add_definitions(-fPIC) 
     else() 
      add_compile_options(-fPIC) 
     endif() 
    endif() 
endif() 

당신은 uname -p 반환 i386uname -m 동안 반환 x86_64, OS X에, 심지어 예를 들어, OS X의에 uname -m, 그 대부분은 정확한으로 기계를 얻을. 10.6이나 10.7이 64 비트 Mac으로 전환 될 때 조금 희미합니다.

가끔 프로세서가 uname -p이되지만 많은 dev-boards에서 실패합니다. 예를 들어 내 ci20 dev-board은 기기의 경우 'mips'를 반환하고 프로세서의 경우 '알 수 없음'을 반환합니다. 또 다른 예는 내 LeMaker HiKey입니다. 컴퓨터에 대해 "aarch64"를 반환하고 프로세서에 대해 "알 수 없음"을 반환합니다.


여전히 Cmake가 제공하는 프로세서 목록을보고 싶습니다.