Jump to content

    
Sign in to follow this  
yanvasilij

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

Recommended Posts

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

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
что-то не понимаю, в чём вопрос.

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

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

 

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

Share this post


Link to post
Share on other sites
Как выяснилось[/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 $@

 

 

Share this post


Link to post
Share on other sites
Извините, но по-моему у Вас в голове каша.

Линковка производится программой 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)

 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this