【问题标题】:Can I skip cmake compiler tests or avoid "error: unrecognized option '-rdynamic'"我可以跳过 cmake 编译器测试或避免“错误:无法识别的选项'-rdynamic'”吗
【发布时间】:2012-05-22 20:45:02
【问题描述】:

用于 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 错误?

【问题讨论】:

    标签: c cmake cross-compiling


    【解决方案1】:

    您可以将 CMAKE_<LANG>_COMPILER_WORKS 设置为 true 以禁止对该语言进行进一步的编译器检查。

    set(CMAKE_C_COMPILER_WORKS 1)
    

    【讨论】:

    • 您可能还需要添加匹配的“CMAKE_CXX_COMPILER_WORKS”行。这对我有用,因为对于特定的交叉编译目标,CMake 坚持使用错误的库路径并且未能链接测试可执行文件,但为实际构建选择了正确的路径。
    【解决方案2】:

    您可以通过将NONE 添加到您的project 调用来跳过编译器检查:

    project(<projectname> NONE)
    

    但这会产生相当深远的影响。有关详细信息,请运行

    cmake --help-command project
    

    我不熟悉 ARM,所以这可能不是您最好的选择。我想你最好看看是否有办法修复-rdynamic 标志。

    编辑:

    看起来这是identified as a bug,实际上仍未解决。错误报告中的 cmets 提到添加以下行作为解决方法(大概在您的 project 调用之前):

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

    【讨论】:

    • 所以 yagarto 是最理智的 arm 编译器 afaik,我不明白为什么“简单程序”要求这个特殊的。
    • @Sholy 我刚刚更新了答案-希望这可以为您解决问题。
    • 我明白了,但遗憾的是我得到了相同的输出:(
    • @Sholy - 好的,这是我最后的猜测 :-) 尝试查看 this thread,但请注意,设置应在调用 project 之前完成。
    • 老实说,它仍在尝试测试......但现在谢谢你,我想我有足够的信息进行研究。
    【解决方案3】:

    看来你的目标实际上不是 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_SHARED_LIBRARY_LINK_C_FLAGS 的问题在于,即使我们只是链接一个不涉及共享库的可执行文件,也会添加-rdynamic。但是将系统名称更改为 Linux 以外的名称是可行的。
    【解决方案4】:

    如果你只是编译一个静态库,并且不想让 CMake 测试编译器可以生成二进制文件,你可以设置变量CMAKE_TRY_COMPILE_TARGET_TYPE。

    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
    

    【讨论】:

      【解决方案5】:

      在没有-rdynamic选项的Windows交叉编译时,可以使用

      -DCMAKE_SYSTEM_NAME="Windows"
      

      使用 cmake。然后 Cmake 将使用 -rdynamic 跳过测试。

      【讨论】:

        猜你喜欢
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        • 2019-08-26
        相关资源
        最近更新 更多