Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何告诉CMake将多个链接器脚本文件指定给GCC?_Gcc_Cmake - Fatal编程技术网

如何告诉CMake将多个链接器脚本文件指定给GCC?

如何告诉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

我正在使用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 
    -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的重要知识。