web-dev-qa-db-ja.com

cmakeコンパイラテストをスキップするか、「エラー:認識されないオプション '-rdynamic'」を回避できますか?

ARMターゲットシステム)のcmake(Windows)のコンパイルオプションですが、configureを実行すると、コンパイラテストが開始されます。

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エラーを修正するにはどうすればよいですか?

29
cnd

NONEproject呼び出しに追加することで、コンパイラチェックをスキップできます。

project(<projectname> NONE)

しかし、これはかなり広範囲にわたる影響を持つ可能性があります。詳細については、実行

cmake --help-command project

私はARMに慣れていないので、これはおそらくここでの最良のオプションではありません。 -rdynamicフラグを修正する方法があるかどうかを確認した方がいいと思います。

編集:

これは バグとして識別された のように見えますが、事実上まだ解決されていません。バグレポートのコメントには、回避策として次の行を追加することが記載されています(おそらくproject呼び出しの前):

set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
26
Fraser

あなたは実際には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()

実際にNONEPROJECT引数として指定してテストを無効にするのではなく、CMAKE_SYSTEM_NAMELinux以外のもの、たとえばGeneric)は、実際に実行したいことです。

23
Anne van Rossum

フラグCMAKE_ <LANG> _COMPILER_WORKSを設定できます。例:

set(CMAKE_C_COMPILER_WORKS 1)

以降のコンパイラチェックを抑制します。

22
adiog

静的ライブラリをコンパイルしているだけで、コンパイラがバイナリを生成できることをテストで確認したくない場合は、変数CMAKE_TRY_COMPILE_TARGET_TYPEを設定できます。

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

https://cmake.org/cmake/help/latest/variable/CMAKE_TRY_COMPILE_TARGET_TYPE.html

1
awelkie