programing

cmake 컴파일러 테스트를 건너뛰거나 "error: 인식할 수 없는 옵션 '-rdynamic'을 피할 수 있습니까?"

abcjava 2023. 8. 14. 22:25
반응형

cmake 컴파일러 테스트를 건너뛰거나 "error: 인식할 수 없는 옵션 '-rdynamic'을 피할 수 있습니까?"

ARM 대상 시스템용 cmake(윈도우)의 컴파일 옵션이지만 실행 시 컴파일러 테스트를 시작합니다.

CMake Error at D:/Program Files/CMake 2.8/share/cmake-2.8/Modules/CMakeTestCCompiler.cmake:52 (MESSAGE):
  The C compiler "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" is not
  able to compile a simple test program.

  It fails with the following output:

   Change Dir: D:/merge/complex/build/CMakeFiles/CMakeTmp



  Run Build Command:D:/PROGRA~1/YAGART~1/bin/make.exe "cmTryCompileExec/fast"

  D:/PROGRA~1/YAGART~1/bin/make.exe -f
  CMakeFiles/cmTryCompileExec.dir/build.make
  CMakeFiles/cmTryCompileExec.dir/build

  make.exe[1]: Entering directory
  `D:/merge/complex/build/CMakeFiles/CMakeTmp'

  "D:/Program Files/CMake 2.8/bin/cmake.exe" -E cmake_progress_report
  D:/merge/complex/build/CMakeFiles/CMakeTmp/CMakeFiles 1

  Building C object CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe" -o
  CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o -c
  D:/merge/complex/build/CMakeFiles/CMakeTmp/testCCompiler.c

  Linking C executable cmTryCompileExec

  "D:/Program Files/yagarto/bin/arm-none-eabi-gcc.exe"
  "CMakeFiles/cmTryCompileExec.dir/testCCompiler.c.o" -o cmTryCompileExec
  -rdynamic 

  arm-none-eabi-gcc.exe: error: unrecognized option '-rdynamic'

  make.exe[1]: *** [cmTryCompileExec] Error 1

Yagatdo 4.6.* 교차 컴파일 도구 체인 사용

이 테스트를 건너뛰거나 -rdynamic 오류를 수정하려면 어떻게 해야 합니까?

설정할 수 있습니다.CMAKE_<LANG>_COMPILER_WORKS해당 언어에 대한 추가 컴파일러 검사를 억제하려면 true를 선택합니다.

set(CMAKE_C_COMPILER_WORKS 1)

다음을 추가하여 컴파일러 검사를 건너뛸 수 있습니다.NONE당신에게project호출:

project(<projectname> NONE)

하지만 이것은 꽤 광범위한 영향을 미칠 수 있습니다.전체 세부 정보를 보려면 실행

cmake --help-command project

저는 ARM에 대해 잘 모르기 때문에 이것은 아마도 당신의 최선의 선택이 아닐 것입니다.제 생각에 당신은 그것을 고칠 방법이 있는지 보는 것이 좋을 것 같습니다.-rdynamic깃발

편집:

이것은 사실상 아직 해결되지 않은 버그로 확인된 것으로 보입니다.버그 보고서의 의견은 해결책으로 다음 행을 추가하는 것을 언급합니다(아마도 당신의 이전에).project호출):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")

실제로 Linux가 아닌 다른 것을 목표로 하는 것 같으니, 일반적인 경우에 대해 교차 컴파일 중이라고 cmake에 말해야 합니다.

SET(CMAKE_SYSTEM_NAME Generic)

다음 순서(선택 사항이지만 지정하기에 좋습니다):

SET(CMAKE_SYSTEM_PROCESSOR arm)
SET(CMAKE_CROSSCOMPILING 1)

그러나 지정한 경우(온라인의 많은 예에 나와 있기 때문에 가능성이 있음):

SET(CMAKE_SYSTEM_NAME Linux)

그런 다음 cmake가 파일(버전 2.8로 가정)에서 구성 파일을 로드합니다.

/usr/share/cmake-2.8/Modules/Platform/Linux.cmake

로드될 가능성이 있는 위치:

/usr/share/cmake-2.8/Modules/Platform/Linux-GNU.cmake

자, 여기서-rdynamic플래그가 설정된 이유는 다음과 같습니다.

macro(__linux_compiler_gnu lang)
  # We pass this for historical reasons.  Projects may have
  # executables that use dlopen but do not set ENABLE_EXPORTS.
  set(CMAKE_SHARED_LIBRARY_LINK_${lang}_FLAGS "-rdynamic")
endmacro()

다음을 지정하여 실제로 수행되는 것처럼 테스트를 비활성화하는 대신NONE처럼PROJECT논쟁, 그것은 설정하는 것처럼 보입니다.CMAKE_SYSTEM_NAME(다른 곳으로)Linux,예를 들어.Generic)가 실제로 원하는 것입니다.

정적 라이브러리를 컴파일할 때 컴파일러가 이진 파일을 생성할 수 있는 CMake 테스트를 수행하지 않으려면 변수를 설정할 수 있습니다.

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

-rdynamic 옵션이 없는 Windows용 크로스 컴파일 시 다음을 사용할 수 있습니다.

-DCMAKE_SYSTEM_NAME="Windows"

씨마케와 함께.그러면 Cmake는 -rdynamic으로 테스트를 건너뜁니다.

언급URL : https://stackoverflow.com/questions/10599038/can-i-skip-cmake-compiler-tests-or-avoid-error-unrecognized-option-rdynamic

반응형