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

 
 
 
Reply to this topicStart new topic
> добавление на этапе компиляции префиксов к символам
SM
сообщение Jan 21 2012, 11:46
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Мне нужно сделать такую вот хитрую вещь - чтобы при сборке статической библиотеки ко всем символам, (достаточно только экспортированным) автоматически добавлялся какой либо заданный мной префикс. Суть вопроса в следующем: имеется десяток разных динамических библиотек, у всех них одинаковые экспортированные функции, их надо собрать статически в один модуль с основной программой. Сейчас я делаю тупо и нагло - собираю статическую библиотеку, получаю список экспортированных символов, после чего скриптом делаю файл "renames.h" вида "#define sym1 prefix_sym1 #define sym2 prefix_sym2" и так далее для всех символов, после чего этот инклудник включаю во все файлы библиотеки, пересобираю, и вуаля. А хочется сделать это красиво как-то. В связи с этим вопрос - есть ли опции в GCC и в MSVC для автоматического добавления юзерских префиксов ко всем символам компилируемого исходника? Или, может быть, это вообще как-то по-другому люди делают?
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 21 2012, 11:58
Сообщение #2


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(SM @ Jan 21 2012, 15:46) *
В связи с этим вопрос - есть ли опции в GCC и в MSVC для автоматического добавления юзерских префиксов ко всем символам компилируемого исходника?


Есть оператор namespace в C++, который позволяет неявно добавлять ко всем именам выделенного блока префиксы.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 21 2012, 12:11
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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

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

UPD хотя фигню наверное говорю, все равно куча дуплицированных символов у линкера вылезет, сомневаюсь что можно сделать так, чтобы приоритет имел символ, взятый из той же либы, откуда к нему обращение, чтобы либы друг с другом не конфликтовали.
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 21 2012, 13:13
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Кажется некие намеки на нужную мне тему в GNU нашлись. "objcopy --prefix-symbols" и вообще через скрипты какие нибудь и objdump/objcopy, хотя пока я себе слабо представляю, как "обпрефиксить" только символы, определенные в пределах этой библиотеки, а символы, внешние по отношению к ней, оставить как есть.
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 22 2012, 18:58
Сообщение #5


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



Цитата(SM @ Jan 21 2012, 15:46) *
...десяток разных динамических библиотек,...их надо собрать статически в один модуль...Сейчас я делаю.. - собираю статическую библиотеку...


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

(круглый)
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 23 2012, 02:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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


IMHO я более чем ясно и однозначно поставил задачу. Внимательнее вопрос прочитайте, там все объяснено, что есть, и как это надо собрать. Если уж совсем в танке - то повторю "на пальцах" - есть у меня допустим три проекта, которые собираются в три динамические либы, в каждой из них есть символы sym1, sym2, sym3. Мне надо собрать из этих же исходников три статические либы, у которых эти символы будут уже называться lib1_sym1, lib2_sym1, lib3_sym1, lib1_sym2, lib2_sym2, и т.д. - при этом исходники не править (с правкой я и сам знаю как, даже описал весь этот процесс).
Go to the top of the page
 
+Quote Post
dxp
сообщение Jan 23 2012, 07:49
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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

Недостаток - два раза компилировать надо, но насколько это критично, судить только вам.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
kolobok0
сообщение Jan 23 2012, 19:46
Сообщение #8


практикующий тех. волшебник
*****

Группа: Участник
Сообщений: 1 190
Регистрация: 9-09-05
Пользователь №: 8 417



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


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

(круглый)
ЗЫ
ИМХО - всех кто в консерватории поставить перед танком и катками, дабы не выросли. Или по другому - надумано сие всё...
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 23 2012, 20:22
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



1) низзя. С++ нету там нигде ни грамма.
2) примерно так и делаю, неудобно, требует вмешательства в исходники, вот был бы ключ у компилера - всегда инклудить заданный инклуд перед всеми инклудами.... Ан нет.

танки и катки не помогут, не тот случай - эти исходники/либы - продукт одной очень большой фирмы, получаемый под договор о неразглашении и под лицензию. И периодически приходят их обновления. А мне надо все те либы ихние в один мой проект впихнуть, обязательно статически, и из-за описанной проблемы пролучается с обновлениями гемор из геморов - нельзя просто заменить исходники новыми и пересобрать, все операции с ними приходится каждый раз делать.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jan 23 2012, 21:26
Сообщение #10


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



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

У GCC -include или, для этой задачи, -imacros
http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gc...ocessor-Options


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SM
сообщение Jan 24 2012, 07:45
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



О, спасибо. Бум переводить виндоверсию с мсвц на гцц.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 06:28
Рейтинг@Mail.ru


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