CMake AMRCC + 自定义链接器

4
我正在尝试在使用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.map(在toolchain.cmake文件中不存在)。
为了让它正常工作,我需要按照以下方式更改<cmake_install_dir>\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支持中的一个bug,所以我会在ARMCC.cmake文件中保留我的更改。

2个回答

5

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

set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)

编辑:如果你的自定义链接器在编译器检查之外也出现问题,只需将你的工具链分成两个文件(toolchain.cmake用于在CMake编译器检测之前读取,makerules.cmake用于在之后读取):

toolchain.cmake

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

makerules.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 <TARGET_BASE>.map”仍然存在(忽略CMAKE_CXX_LINK_EXECUTABLE变量的覆盖)。 - Valmir
1
@Valmir 工具链是在所有其他内容之前加载的(请参见这里)。如果您想要在CMake编译器检测后更改普通变量,则需要通过CMAKE_USER_MAKE_RULES_OVERRIDE提供另一个脚本(请参见这里)。通常情况下,您不需要将CMAKE_CXX_LINK_EXECUTABLE设置从工具链移动到这样的单独文件中。我认为这些变量被视为非缓存是ARMCC支持中的错误。 - Florian
再次感谢@Florian。不幸的是,我会保留在ARMCC.cmake中的更改,以使我的项目正常工作。 - Valmir

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接