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

ARM Compiler 6 (LLVM/CLang): можно ли компилировать несколько файлов как один?

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

Т.е. не все файлы проекта, а только конкретные (идеально было бы в Keil-е как-то пометить "группу").

Есть такое? В других компиляторах бывает?

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


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

Делаете общий C-файл, включаете его в проект, а в нем уже делаете #include ваших С-шников - профит.

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


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

8 minutes ago, Arlleex said:

Есть такое?

В keil такого нет, но можно индивидуально для любого исполняемого файла по ALT+F7 в окне снять галку Include In Target Build и создать, как предложил коллега makc выше, отдельный исполняемый файл, куда заинклудить нужные исполняемые файлы.

Все это добро сложить в отдельную группу чтобы было наглядно.

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


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

Вы имеете в виду что-то типа

// common.cpp

#include "src1.cpp"
#include "src2.cpp"
#include "src3.cpp"
...

поставить сами src1/2/3.cpp как некомпилируемые файлы, а common.cpp компилировать?

Хм. Хорошая идея, почему я сразу не подумал так сделать:wink: Спасибо.

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


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

14 minutes ago, Arlleex said:

поставить сами src1/2/3.cpp как некомпилируемые файлы, а common.cpp компилировать?

да, это самое простое, везде работает )

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


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

А теперь другой вопрос: кто-нибудь так сам делает, или это я только велосипеды изобретаю?))

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


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

32 минуты назад, Arlleex сказал:

поставить сами src1/2/3.cpp как некомпилируемые файлы, а common.cpp компилировать?

Именно так.

1 минуту назад, Arlleex сказал:

А теперь другой вопрос: кто-нибудь так сам делает, или это я только велосипеды изобретаю?))

Так делают, я тоже так делал, но стараюсь этого избегать.

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


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

1 hour ago, Arlleex said:

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

50 minutes ago, makc said:

Так делают, я тоже так делал, но стараюсь этого избегать.

а можно в двух словах, зачем?

я смог только придумать наличие каких-нибудь "глобальных" static функций/переменных, которые надо чтобы не торчали наружу из этой единицы компиляции, но при этом были доступны друг другу из src1/2/3.cpp.

но у файлов расрширение .cpp а не .с и соответственно наличие namespace для таких случаев.

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


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

6 минут назад, _pv сказал:

я смог только придумать наличие каких-нибудь "глобальных" static функций/переменных, которые надо чтобы не торчали наружу из этой единицы компиляции, но при этом были доступны друг другу из src1/2/3.cpp.

Это была одна из решаемых проблем. А вторая была связана с переименованием реализаций функций, аналогично тому, как это сделано в грабе - см. https://github.com/coreos/grub/blob/2.02-coreos/grub-core/loader/macho32.c и рядом.

7 минут назад, _pv сказал:

но у файлов расрширение .cpp а не .с и соответственно наличие namespace для таких случаев.

namespace это вариант, но у меня был чистый C.

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

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


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

2 hours ago, Arlleex said:

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

Т.е. не все файлы проекта, а только конкретные (идеально было бы в Keil-е как-то пометить "группу").

Есть такое? В других компиляторах бывает?

Конечно. Лет 10 точно.

image.png.539fd9b7523335c0a5665dc4780c3985.png

 

image.png.8cfec354f1643aa0547e26230cf52b46.png

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


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

1 час назад, _pv сказал:

а можно в двух словах, зачем?

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

41 минуту назад, x893 сказал:

Конечно. Лет 10 точно.

У Вас конкретно для чего оное используется?

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


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

42 minutes ago, Arlleex said:

Я хочу добиться очень хорошей оптимизации

А что проект уже не влезает в камень? :mda:

Просто подобная "оптимизация" скорости коду точно не добавит. А размер - спорно, разве что эксперимента ради ))

 

А для себя давно решил, что достаточно в опциях компилятора на весь проект ставить одну единственную крайне важную галку "One ELF Section Per Function", которая прекрасно помогает компилятору линкеру убрать из кода всякий неиспользуемый в коде хлам.

 

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


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

1 час назад, Forger сказал:

Просто подобная "оптимизация" скорости коду точно не добавит. А размер - спорно, разве что эксперимента ради ))

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

И многое другое...

Всё это может дать существенный прирост скорости выполнения. И чем умнее компилятор - тем больше будет выигрыш в скорости.

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


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

1 час назад, Forger сказал:

А что проект уже не влезает в камень? :mda:

По размеру кода влезает пока что, с запасом. На самом деле, по скорости тоже: но мне еще нужон LwIP, а он на коротких пакетах (и максимальной сетевой скорости) итак кадры не успевает обработать((

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...