如何告诉CMake将多个链接器脚本文件指定给GCC?
我正在使用CMake 3.17和GNU ARM工具链,我正在尝试将一个构建从Eclipse迁移到CMake。Eclipse构建的一部分指定了在链接时使用的多个链接器脚本文件,因此我将CMakeLists.txt文件设置为:如何告诉CMake将多个链接器脚本文件指定给GCC?,gcc,cmake,Gcc,Cmake,我正在使用CMake 3.17和GNU ARM工具链,我正在尝试将一个构建从Eclipse迁移到CMake。Eclipse构建的一部分指定了在链接时使用的多个链接器脚本文件,因此我将CMakeLists.txt文件设置为: target_link_options(${application_name} PRIVATE -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -fmessag
target_link_options(${application_name} PRIVATE
-mcpu=cortex-m4
-mthumb
-mfloat-abi=hard
-mfpu=fpv4-sp-d16
-fmessage-length=0
-fsigned-char
-ffunction-sections
-fdata-sections
-flto
-Wall
-Xlinker --gc-sections
-Wl,-Map,${map_file}
-T ${CMAKE_SOURCE_DIR}/ldscripts/libs.ld
-T ${CMAKE_SOURCE_DIR}/ldscripts/mem.ld
-T ${CMAKE_SOURCE_DIR}/ldscripts/sections.ld
)
但是当我运行make时,第二个和第三个文件的-T选项被吞没了。以下是在成功编译所有源代码后运行make VERBOSE=1时得到的结果。链接器命令行后跟关于缺少-T选项的警告:
为什么在最后两个文件中,-T不能正确地发送到命令行
我曾尝试将链接脚本规范分成三个单独的调用,分别调用target\u link\u选项,并将每个脚本规范用双引号括起来,但似乎没有效果。因为-T被解释为一个选项。将-T与路径粘合在一起。尝试:
-T${CMAKE_SOURCE_DIR}/ldscripts/libs.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/mem.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/sections.ld
因为-T被解释为单个选项。将-T与路径粘合在一起。尝试:
-T${CMAKE_SOURCE_DIR}/ldscripts/libs.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/mem.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/sections.ld
默认情况下,CMake消除重复编译和链接选项。也就是说,多个-T选项组合成一个选项
CMake不知道哪些选项实际上与其他参数相关联,但提供了一种SHELL:机制来定义这些选项:
target_link_options(${application_name} PRIVATE
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/libs.ld"
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/mem.ld"
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/sections.ld"
)
此机制在for target_link_options命令中描述
同样的机制也适用于传递给目标编译选项的编译器选项,请参见该机制。默认情况下,CMake消除重复编译和链接选项。也就是说,多个-T选项组合成一个选项
CMake不知道哪些选项实际上与其他参数相关联,但提供了一种SHELL:机制来定义这些选项:
target_link_options(${application_name} PRIVATE
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/libs.ld"
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/mem.ld"
"SHELL:-T ${CMAKE_SOURCE_DIR}/ldscripts/sections.ld"
)
此机制在for target_link_options命令中描述
同样的机制也适用于传递给目标编译选项的编译器选项,请参见并查看它。是否尝试将每个参数置于引号中?e、 例如,-T${CMAKE_SOURCE_DIR}/ldscripts/libs.ld-T${CMAKE_SOURCE_DIR}/ldscripts/mem.ldI尝试了,但没有骰子。尝试将每个参数都用引号引起来吗?e、 例如,-T${CMAKE_SOURCE_DIR}/ldscripts/libs.ld-T${CMAKE_SOURCE_DIR}/ldscripts/mem.ldI尝试了这个方法,但没有成功。在看到这个并重新阅读文档后,我了解了现在的情况,并用这个方法修复了我的问题。谢谢在看到这些并重新阅读文档后,我了解了现在的情况,并用这种方法解决了我的问题。谢谢这同样有效。我选择以上作为答案,因为这似乎是一个更好的长期解决方案,也教会了我一些关于CMake的重要知识。这也很有效。我选择以上作为答案,因为这似乎是一个更好的长期解决方案,也教会了我一些关于CMake的重要知识。