Как сообщить CMake указать несколько файлов сценариев компоновщика для G CC? - PullRequest
1 голос
/ 20 июня 2020

Я использую 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:

Linking CXX executable StartupSequence.elf
/D/gcc-arm-none-eabi-9-2019-q4/bin/arm-none-eabi-g++.exe    --specs=nano.specs --specs=nosys.specs -g -Og -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,StartupSequence.map -T C:/svn/startup_sequence/ldscripts/libs.ld C:/svn/startup_sequence/ldscripts/mem.ld C:/svn/startup_sequence/ldscripts/sections.ld @CMakeFiles/StartupSequence.dir/objects1.rsp  -o StartupSequence.elf  ../Drivers/CMSIS/DSP/Lib/libarm_cortexM4lf_math.a ../Middlewares/Third_Party/mbedTLS/library/libmbedcrypto.a
d:/gcc-arm-none-eabi-9-2019-q4/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld.exe: warning: C:/svn/startup_sequence/ldscripts/sections.ld contains output sections; did you forget -T?

Почему -T не отправляется в командную строку должным образом для последних двух файлов?

Я пробовал разделить спецификацию скрипта ссылки на три отдельных вызова target_link_options и заключить каждую спецификацию скрипта в двойные кавычки, но это, похоже, не имеет никакого эффекта.

Ответы [ 2 ]

3 голосов
/ 20 июня 2020

По умолчанию 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"
)

Этот механизм описан в документации для target_link_options команды.


Тот же механизм работает для параметров компилятора, переданных в target_compile_options, см. вопрос и мой ответ на него.

1 голос
/ 20 июня 2020

Потому что -T интерпретируется как единственный вариант. Вместо этого приклейте -T к пути. Попробуйте:

-T${CMAKE_SOURCE_DIR}/ldscripts/libs.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/mem.ld
-T${CMAKE_SOURCE_DIR}/ldscripts/sections.ld
...