Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: добавление на этапе компиляции префиксов к символам
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
SM
Мне нужно сделать такую вот хитрую вещь - чтобы при сборке статической библиотеки ко всем символам, (достаточно только экспортированным) автоматически добавлялся какой либо заданный мной префикс. Суть вопроса в следующем: имеется десяток разных динамических библиотек, у всех них одинаковые экспортированные функции, их надо собрать статически в один модуль с основной программой. Сейчас я делаю тупо и нагло - собираю статическую библиотеку, получаю список экспортированных символов, после чего скриптом делаю файл "renames.h" вида "#define sym1 prefix_sym1 #define sym2 prefix_sym2" и так далее для всех символов, после чего этот инклудник включаю во все файлы библиотеки, пересобираю, и вуаля. А хочется сделать это красиво как-то. В связи с этим вопрос - есть ли опции в GCC и в MSVC для автоматического добавления юзерских префиксов ко всем символам компилируемого исходника? Или, может быть, это вообще как-то по-другому люди делают?
Xenia
Цитата(SM @ Jan 21 2012, 15:46) *
В связи с этим вопрос - есть ли опции в GCC и в MSVC для автоматического добавления юзерских префиксов ко всем символам компилируемого исходника?


Есть оператор namespace в C++, который позволяет неявно добавлять ко всем именам выделенного блока префиксы.
SM
С++ не годится, все на чистом C, цель то именно без переработки исходников библиотек все сделать, они периодически обновляются, и не мной.

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

UPD хотя фигню наверное говорю, все равно куча дуплицированных символов у линкера вылезет, сомневаюсь что можно сделать так, чтобы приоритет имел символ, взятый из той же либы, откуда к нему обращение, чтобы либы друг с другом не конфликтовали.
SM
Кажется некие намеки на нужную мне тему в GNU нашлись. "objcopy --prefix-symbols" и вообще через скрипты какие нибудь и objdump/objcopy, хотя пока я себе слабо представляю, как "обпрефиксить" только символы, определенные в пределах этой библиотеки, а символы, внешние по отношению к ней, оставить как есть.
kolobok0
Цитата(SM @ Jan 21 2012, 15:46) *
...десяток разных динамических библиотек,...их надо собрать статически в один модуль...Сейчас я делаю.. - собираю статическую библиотеку...


вы для начала определитесь - чего вы собираете. динамические или статические либы.
и второе. динамические библиотеки можно грузить явно - тогда проблем вообще нет.

(круглый)
SM
Цитата(kolobok0 @ Jan 22 2012, 22:58) *
вы для начала определитесь - чего вы собираете. динамические или статические либы.


IMHO я более чем ясно и однозначно поставил задачу. Внимательнее вопрос прочитайте, там все объяснено, что есть, и как это надо собрать. Если уж совсем в танке - то повторю "на пальцах" - есть у меня допустим три проекта, которые собираются в три динамические либы, в каждой из них есть символы sym1, sym2, sym3. Мне надо собрать из этих же исходников три статические либы, у которых эти символы будут уже называться lib1_sym1, lib2_sym1, lib3_sym1, lib1_sym2, lib2_sym2, и т.д. - при этом исходники не править (с правкой я и сам знаю как, даже описал весь этот процесс).
dxp
QUOTE (SM @ Jan 23 2012, 09:26) *
есть у меня допустим три проекта, которые собираются в три динамические либы, в каждой из них есть символы sym1, sym2, sym3. Мне надо собрать из этих же исходников три статические либы, у которых эти символы будут уже называться lib1_sym1, lib2_sym1, lib3_sym1, lib1_sym2, lib2_sym2, и т.д. - при этом исходники не править (с правкой я и сам знаю как, даже описал весь этот процесс).

Почему бы просто не заавтоматизировать то, что вы делаете руками: при компиляции очередного файла компилируется исходный файл, извлекается список экспортируемых имён, далее генерируется либо новый сорец с префиксными именами, либо как вы делали через дефайны, компилируется окончательный вариант. Исходный файл остаётся без изменений. Такую автоматизацию сделать совсем не сложно - вместо запуска только одного компилятора выполнить пакетный запуск набора инструментов.

Недостаток - два раза компилировать надо, но насколько это критично, судить только вам.
kolobok0
Цитата(SM @ Jan 23 2012, 06:26) *
...в каждой из них есть символы sym1, sym2, sym3. Мне надо собрать из этих же исходников три статические либы, у которых эти символы будут уже называться lib1_sym1, lib2_sym1, lib3_sym1, lib1_sym2, lib2_sym2, и т.д..


1) уже прозвучало - нэймспэйсы. это если тупо инкапсулировать и не париться.
2) задефайнить префиксы и в условиях сборки задавать нужные закорючки.

(круглый)
ЗЫ
ИМХО - всех кто в консерватории поставить перед танком и катками, дабы не выросли. Или по другому - надумано сие всё...
SM
1) низзя. С++ нету там нигде ни грамма.
2) примерно так и делаю, неудобно, требует вмешательства в исходники, вот был бы ключ у компилера - всегда инклудить заданный инклуд перед всеми инклудами.... Ан нет.

танки и катки не помогут, не тот случай - эти исходники/либы - продукт одной очень большой фирмы, получаемый под договор о неразглашении и под лицензию. И периодически приходят их обновления. А мне надо все те либы ихние в один мой проект впихнуть, обязательно статически, и из-за описанной проблемы пролучается с обновлениями гемор из геморов - нельзя просто заменить исходники новыми и пересобрать, все операции с ними приходится каждый раз делать.
ReAl
Цитата(SM @ Jan 23 2012, 22:22) *
вот был бы ключ у компилера - всегда инклудить заданный инклуд перед всеми инклудами.... Ан нет.

У GCC -include или, для этой задачи, -imacros
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gc...ocessor-Options
SM
О, спасибо. Бум переводить виндоверсию с мсвц на гцц.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.