CMake AMRCC + 自定义链接器
CMake AMRCC + custom linker
我正在尝试在使用 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 支持中的错误,因此我将在 ARMCC.cmake 文件中保留我的更改。
这正是一个相对较新的用例 (version 3.6) global CMake variable named CMAKE_TRY_COMPILE_TARGET_TYPE
。因此只需将以下内容添加到您的工具链文件中:
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")
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>")
参考文献
显然这是 cmake 的 armcc 支持中的一个错误,所以我会在 ARMCC.cmake 文件中保留我的更改。
我正在尝试在使用 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 支持中的错误,因此我将在 ARMCC.cmake 文件中保留我的更改。
这正是一个相对较新的用例 (version 3.6) global CMake variable named CMAKE_TRY_COMPILE_TARGET_TYPE
。因此只需将以下内容添加到您的工具链文件中:
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")
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>")
参考文献
显然这是 cmake 的 armcc 支持中的一个错误,所以我会在 ARMCC.cmake 文件中保留我的更改。