【问题标题】:CMake AMRCC + custom linkerCMake AMRCC + 自定义链接器
【发布时间】:2016-07-13 19:06:21
【问题描述】:

我正在尝试在使用armcc 编译的项目中使用cmake,但使用自定义专有链接器(不是armlink)。

我已将toolchain.cmake 文件中的变量更改如下:

unset (CMAKE_LINKER CACHE)
set (CMAKE_LINKER "my_linker" CACHE STRING "" FORCE)

unset (CMAKE_ARMCC_LINKER CACHE)
set (CMAKE_ARMCC_LINKER "my_linker" CACHE STRING "" FORCE)

unset (CMAKE_EXE_LINKER_FLAGS CACHE )
set (CMAKE_EXE_LINKER_FLAGS "-flag1 -flag2" CACHE STRING "" FORCE)

unset (CMAKE_C_LINK_EXECUTABLE)
set (CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>")

unset (CMAKE_CXX_LINK_EXECUTABLE)
set (CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>")

但是当cmake 尝试检查我的编译器套件时,它在链接步骤中失败了:

-- Check for working C compiler: armcc.exe -- broken
CMake Error at C:/Program Files (x86)/CMake/share/cmake-3.6/Modules/CMakeTestCCompiler.cmake:61 (message):
  The C compiler "armcc.exe" is not able to compile a simple test program.

... (compiling commands that worked hidden here)

Linking C executable cmTC_c08ef.elf

"C:\Program Files (x86)\CMake\bin\cmake.exe" -E cmake_link_script CMakeFiles\cmTC_c08ef.dir\link.txt --verbose=1

my_linker -flag1 -flag2 CMakeFiles/cmTC_c08ef.dir/testCCompiler.o -o cmTC_c08ef.elf --list cmTC_c08ef.map

问题在于命令行末尾的--list cmTC_c08ef.maptoolchain.cmake 文件中不存在)。

为了使它工作,我需要更改文件&lt;cmake_install_dir&gt;\Modules\Compiler\ARMCC.cmake 如下:

  set(CMAKE_${lang}_LINK_EXECUTABLE      "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET> --list <TARGET_BASE>.map")
#  set(CMAKE_${lang}_LINK_EXECUTABLE      "<CMAKE_LINKER> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES> <OBJECTS> -o <TARGET>")

有更好的方法来解决这个问题还是唯一的方法?

编辑:显然这是 cmake 的 armcc 支持中的一个错误,所以我会将我的更改保留在 ARMCC.cmake 文件中。

【问题讨论】:

    标签: c++ linker cmake linker-flags


    【解决方案1】:

    这正是一个名为 CMAKE_TRY_COMPILE_TARGET_TYPE 的相对较新的 (version 3.6) 全局 CMake 变量的用例。因此,只需将以下内容添加到您的工具链文件中:

    set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
    

    编辑:如果您的自定义链接器还在编译器检查之外给您带来麻烦,只需将您的工具链分成 2 个文件(toolchain.cmake 之前要读取,makerules.cmake 在 CMake 的编译器检测之后) :

    toolchain.cmake

    [...]
    set (CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_CURRENT_LIST_FILE}/makerules.cmake")
    

    ma​​kerules.cmake

    set (CMAKE_C_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>")
    set (CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_LINKER> <CMAKE_EXE_LINKER_FLAGS> <OBJECTS> <LINK_LIBRARIES> -o <TARGET>")
    

    参考

    【讨论】:

    • 感谢您的回复@Florian。这样检查步骤就起作用了,但是当我尝试链接我的应用程序时,“--list .map”仍然在这里(忽略 CMAKE_CXX_LINK_EXECUTABLE 变量的覆盖)。
    • @Valmir 工具链在其他所有内容之前加载(请参阅here)。如果您想在 CMake 编译器检测后更改普通变量,您需要通过CMAKE_USER_MAKE_RULES_OVERRIDE 提供另一个脚本(请参阅here)。您通常不需要将您的 CMAKE_CXX_LINK_EXECUTABLE 设置从您的工具链移动到这样一个单独的文件中。我认为这些变量未缓存是 ARMCC 支持中的一个错误。
    • 再次感谢@Florian。不幸的是,我将在 ARMCC.cmake 中保留我的更改,以保持我的项目正常运行。
    【解决方案2】:

    显然这是 cmake 的 armcc 支持中的一个错误,所以我会将我的更改保留在 ARMCC.cmake 文件中。

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-20
      • 2020-10-01
      • 1970-01-01
      • 2017-05-07
      • 1970-01-01
      相关资源
      最近更新 更多