реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> cmake + arm-none-eaby линковка одновременно статической библиотеки и hex
yanvasiij
сообщение Mar 30 2016, 11:51
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



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

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

Go to the top of the page
 
+Quote Post
Aaron
сообщение Mar 30 2016, 11:59
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007



что-то не понимаю, в чём вопрос.
Создать цель сборки, состоящую из двух зависимостей - исполняемого файла и либы.
Вызывать эту цель сборки, соберётся и то, и то.
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Mar 30 2016, 12:11
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(Aaron @ Mar 30 2016, 16:59) *
что-то не понимаю, в чём вопрос.
Создать цель сборки, состоящую из двух зависимостей - исполняемого файла и либы.
Вызывать эту цель сборки, соберётся и то, и то.


Ну вот как указать, чтобы либа собиралась arm-none-eabi-gcc-ar?
Go to the top of the page
 
+Quote Post
alx2
сообщение Apr 1 2016, 05:19
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(yanvasiij @ Mar 30 2016, 17:51) *
Как выяснилось[/url] линковка статических либ осуществляется arm-none-eabi-gcc-ar, а линковка исполняемого файла arm-none-eabi-gcc. Как же сделать так, чтобы на выходе получать и то и то?

Извините, но по-моему у Вас в голове каша.
Линковка производится программой ld, так как именно это и есть линкер.
Программа ar - это архиватор, который объединяет объектные файлы в архив (библиотеку).
Программа же gcc - это просто враппер, который сам по себе никакой обработки компонентов программы не выполняет, а вызывает для этого другое программы - препроцессор, компилятор, ассемблер, линкер. Каким именно операции будут выполнены, зависит от параметров командной строки.
Думаю, Вам стоит разобраться, из каких этапов (операций) состоит процесс сборки программы, что для каждого этапа является входными данными, а что - результатом.

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

Цитата(yanvasiij @ Mar 30 2016, 18:11) *
Ну вот как указать, чтобы либа собиралась 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 $@




--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
yanvasiij
сообщение Apr 2 2016, 04:12
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 321
Регистрация: 23-12-11
Из: Уфа
Пользователь №: 69 041



Цитата(alx2 @ Apr 1 2016, 10:19) *
Извините, но по-моему у Вас в голове каша.
Линковка производится программой ld, так как именно это и есть линкер.
Программа ar - это архиватор, который объединяет объектные файлы в архив (библиотеку).
Программа же gcc - это просто враппер, который сам по себе никакой обработки компонентов программы не выполняет, а вызывает для этого другое программы - препроцессор, компилятор, ассемблер, линкер. Каким именно операции будут выполнены, зависит от параметров командной строки.
Думаю, Вам стоит разобраться, из каких этапов (операций) состоит процесс сборки программы, что для каждого этапа является входными данными, а что - результатом.

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


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

Цитата(alx2 @ Apr 1 2016, 10:19) *
Указать кому/чему? 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)


Это вообщем-то я и спрашивал - не сразу удалось разобраться, поэтому и спросил.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th June 2025 - 05:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016