Перейти к содержанию
    

cmake + arm-none-eaby линковка одновременно статической библиотеки и hex

Доброго времени суток!

 

Ситуация такая. Компилирую проект через make полученный cmake. Когда мне нужен просто исполняемый файл(alf, hex и т.п.) или просто статическая библиотека проблем нет, но мне нужно получать одновременно и статическую библиотеку и hex. Как выяснилось линковка статических либ осуществляется arm-none-eabi-gcc-ar, а линковка исполняемого файла arm-none-eabi-gcc. Как же сделать так, чтобы на выходе получать и то и то?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что-то не понимаю, в чём вопрос.

Создать цель сборки, состоящую из двух зависимостей - исполняемого файла и либы.

Вызывать эту цель сборки, соберётся и то, и то.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

что-то не понимаю, в чём вопрос.

Создать цель сборки, состоящую из двух зависимостей - исполняемого файла и либы.

Вызывать эту цель сборки, соберётся и то, и то.

 

Ну вот как указать, чтобы либа собиралась arm-none-eabi-gcc-ar?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как выяснилось[/url] линковка статических либ осуществляется arm-none-eabi-gcc-ar, а линковка исполняемого файла arm-none-eabi-gcc. Как же сделать так, чтобы на выходе получать и то и то?

Извините, но по-моему у Вас в голове каша.

Линковка производится программой ld, так как именно это и есть линкер.

Программа ar - это архиватор, который объединяет объектные файлы в архив (библиотеку).

Программа же gcc - это просто враппер, который сам по себе никакой обработки компонентов программы не выполняет, а вызывает для этого другое программы - препроцессор, компилятор, ассемблер, линкер. Каким именно операции будут выполнены, зависит от параметров командной строки.

Думаю, Вам стоит разобраться, из каких этапов (операций) состоит процесс сборки программы, что для каждого этапа является входными данными, а что - результатом.

 

И сам вопрос ваш, действительно, непонятен. Если Вы знаете и как получить библиотеку, и как получить hex-файл, какая проблема выполнить и то, и другое?

 

Ну вот как указать, чтобы либа собиралась arm-none-eabi-gcc-ar?

Указать кому/чему? make'у? Написать в Makefile что-то типа:

 

liba.a: file1.o file2.o file3.o
          arm-none-eabi-gcc-ar cq $@ $^
          arm-none-eabi-gcc-ranlib $@

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Извините, но по-моему у Вас в голове каша.

Линковка производится программой ld, так как именно это и есть линкер.

Программа ar - это архиватор, который объединяет объектные файлы в архив (библиотеку).

Программа же gcc - это просто враппер, который сам по себе никакой обработки компонентов программы не выполняет, а вызывает для этого другое программы - препроцессор, компилятор, ассемблер, линкер. Каким именно операции будут выполнены, зависит от параметров командной строки.

Думаю, Вам стоит разобраться, из каких этапов (операций) состоит процесс сборки программы, что для каждого этапа является входными данными, а что - результатом.

 

И сам вопрос ваш, действительно, непонятен. Если Вы знаете и как получить библиотеку, и как получить hex-файл, какая проблема выполнить и то, и другое?

 

Да я напутал с названиями и терминами. От этого вопрос и получился непонятным. Но, как это не парадоксально я знаю то, о чем Вы говорите.

 

Указать кому/чему? make'у? Написать в Makefile что-то типа:

 

liba.a: file1.o file2.o file3.o
          arm-none-eabi-gcc-ar cq $@ $^
          arm-none-eabi-gcc-ranlib $@

 

По сути мне нужно было только узнать, каким образом указать CMAKE, чтобы он использовал в качестве архиватора именно arm-none-eabi-gcc-ar.

Я разобрался. Чтобы получить в результате компиляции проекта статический архив (библиотеку) и одновременно исполняемый hex-файл нужно присвоить CMAKE переменной CMAKE_AR значение пути к программе архиватору:

 

SET(CMAKE_AR arm-none-eabi-gcc-ar CACHE INTERNAL "")

 

А затем добавить создание архива (библиотеки) с последующим его использованием при линковке приложения:

 

ADD_LIBRARY(mylib ${PROJECT_SOURCES})
ADD_EXECUTABLE(${CMAKE_PROJECT_NAME}.elf  ${CAP_SOURCES})
TARGET_LINK_LIBRARIES(${CMAKE_PROJECT_NAME}.elf runTime)
ADD_CUSTOM_COMMAND(TARGET ${CMAKE_PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} ARGS -Oihex ${CMAKE_PROJECT_NAME}.elf ${CMAKE_PROJECT_NAME}.hex)

 

Это вообщем-то я и спрашивал - не сразу удалось разобраться, поэтому и спросил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...