CMake: как указать разные сценарии ссылок для каждой цели - PullRequest
0 голосов
/ 02 мая 2019

У меня есть несколько целей, которые делаются в проекте CMake.У каждой цели есть свой скрипт (файл LD).Как мне написать файл CMakeLists.txt, чтобы это произошло?Это для встроенного проекта с файлами C / C ++ / ASM.

Это то, что у меня есть до сих пор.Проблема в том, что LINKER_SCRIPT определяется глобально, а не для каждой цели.

# add alpha target
add_executable(alpha.elf ${SOURCES})
target_compile_definitions(alpha.elf PUBLIC -DALPHA_DEFINED)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Linker/alpha.ld)

# add beta target
add_executable(beta.elf ${SOURCES})
target_compile_definitions(beta.elf PUBLIC -DBETA_DEFINED)
set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/Linker/beta.ld)

set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -T ${LINKER_SCRIPT}")

Проблема в том, что LINKER_SCRIPT перезаписывается и используется последнее определение.Как я могу заставить эту работу работать?

Я попытался определить переменную для каждого целевого объекта, используя следующее, однако вывод не такой, как ожидалось.Файл компилируется, но все не так, как должно быть.Например, сгенерированный файл HEX не начинается с 0x08000000, где он должен быть определен для файла LD.

set_target_properties(alpha.elf PROPERTIES
        CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_BINARY_DIR}/alpha.elf.map -T ${CMAKE_SOURCE_DIR}/Linker/alpha.ld")

1 Ответ

1 голос
/ 02 мая 2019

Переменная LINKER_SCRIPT просто перезаписывается во второй раз, когда вы устанавливаете значение.Он имеет не глобальную область видимости, а область действия подкаталога / функции.Но, как и любая переменная, она принимает последнее значение.

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

Нет переменных для каждой цели, о которых я знаю.set_target_properties используется для установки свойств.Некоторые свойства известны CMake, но свойство CMAKE_EXE_LINKER_FLAGS не является одним из них.Его следует просто игнорировать при создании файлов сборки.

Попробуйте использовать target_link_options для установки свойства для целевой цели LINK_OPTIONS, которое известно, и эта опция появится при связывании исполняемого файла.

Например target_link_options(alpha.elf PRIVATE -T${CMAKE_SOURCE_DIR}/Linker/alpha.ld).Я не использовал его с опциями, в которых есть пробел, так что это может быть проблемой.

Чтобы повторно связать, если скрипт компоновщика изменится, обратитесь к этому ответу: https://stackoverflow.com/a/42138375/1028434

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...