Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
1970 / 826 / 115
Регистрация: 01.10.2012
Сообщений: 4,965
Записей в блоге: 2

Линковка 2 static либ (nix платформа)

16.04.2023, 21:19. Показов 1205. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день

Не нашел более подходящего раздела, потому постю сюда

Есть 2 static либы - не мои, перекомпилить их я не могу, с одинаковым набором используемых ф-ций. Вернее это 2 версии/реализации. И вот ситуация сложилась так что нужны обе. Нужно чтобы работало так (псевдокод)
C++
1
2
3
4
if (flag) 
  lib1::do_login();
else 
  lib2::do_login();
Обычно в ++ библиотеках это решается namespace'ом, но здесь его нет (C API). Правила форума советуют "максимально полно изложить проблему, что делалось для ее решения и.т.п." - понимаю, но в данном случае это займет много страниц и скорее запутает. Начал с того что тупо добавил обе либы в проект, и, конечно, ожидал ошибок линкера типа "duplicate symbol(s)". Ни фига, слинковало без звука Нашел что, да, так и должно быть, по принципу "кого нашли первым". И таких приключений много, расписывать все нет смысла. Платформа и компилятор: OSX 12.6.5, clang, Xcode 13 (хотя вижу что проблема та же на любой unix платформе)

Спасибо
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.04.2023, 21:19
Ответы с готовыми решениями:

Компилятор mingw32 (платформа Linux, целевая - Windows), линковка
Make-файл: MainCpp=main GppCompilerWin32="///usr/bin/i586-pc-mingw32-g++" ...

Статическая линковка VS динамическая линковка
Существует два типа линкования библиотек: статическое и динамическое. При статической линковке все подключённые к проекту библиотеки .lib...

Этажная платформа (или платформа из Starbound) 2D
Для того чтобы вы поняли что это за платформа (я просто не знаю как она называется), я залил видео на ютуб (https://youtu.be/Zdg7q5gsHis),...

5
267 / 199 / 30
Регистрация: 26.11.2022
Сообщений: 869
16.04.2023, 22:09
можно попробовать извратиться:
1) написать две динамических либы - по одной на каждую статическую и сделать в них экспорт нужных функций
или даже свою либу но слинковать её в двух разных вариантах - каждый со своей статической.
2) подгружать обе либы и использовать их

не факт что будет работать но можно попробовать.
0
1970 / 826 / 115
Регистрация: 01.10.2012
Сообщений: 4,965
Записей в блоге: 2
16.04.2023, 23:47  [ТС]
Цитата Сообщение от Aledveu Посмотреть сообщение
можно попробовать извратиться:
1) написать две динамических либы - по одной на каждую статическую и сделать в них экспорт нужных функций
или даже свою либу но слинковать её в двух разных вариантах - каждый со своей статической.
2) подгружать обе либы и использовать их
не факт что будет работать но можно попробовать.
Я сделал одну динамическую. Линкуется без ошибок, но проблема в том что ф-ции статической либы (напр do_login) по-прежнему открыты/доступны. Закрыть их с помощью опции -fvisibility не удается, она не имеет эффекта для ф-ций статик либы (той что слинкована с динамической). Я могу сделать разные имена для каждой динамической, но это ничего не гарантирует - я использую 15-20 ф-ций, а в либах их намного больше. Не факт что они не вызываются и не факт что слинкуется "своя"
0
599 / 421 / 137
Регистрация: 02.10.2008
Сообщений: 1,798
Записей в блоге: 1
17.04.2023, 05:55
Igor3D,
Цитата Сообщение от Aledveu Посмотреть сообщение
1) написать две динамических либы - по одной на каждую статическую и сделать в них экспорт нужных функций
или даже свою либу но слинковать её в двух разных вариантах - каждый со своей статической.
Только дополню - обе динамические либы даже без враппера можно написать - пустые. А с помощью dlopen() грузить вручную ту, которая нужна, в зависимости от flag
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
17.04.2023, 09:19
Лучший ответ Сообщение было отмечено Igor3D как решение

Решение

Цитата Сообщение от Igor3D Посмотреть сообщение
Закрыть их с помощью опции -fvisibility не удается,
Есть специальный ключ, который делает скрытыми имена из статических библиотек, правда он работает только на платформах, где есть GNU Binutils, и это видимо как раз не ваш случай, но все равно для информации скажу.
Ключ линкера -Wl,--exclude-libs=lib1.a или даже -Wl,--exclude-libs=ALL спрячет символы из указанных (или всех, в случае ALL) статических библиотек, участвующих в линковке.
--exclude-libs lib,lib,...
Specifies a list of archive libraries from which symbols should not be automatically exported. The library names may be delimited by commas or colons. Specifying "--exclude-libs ALL" excludes symbols in all archive libraries from automatic export. This option is available only for the i386 PE targeted port of the linker and for ELF targeted ports. For i386 PE, symbols explicitly listed in a .def file are still exported, regardless of this option. For ELF targeted ports, symbols affected by this option will be treated as hidden.
Еще (или в дополнение) можно использовать белый список экспортируемых функций, ключ линкера -Wl,--retain-symbols-file=exports.txt, где exports.txt содержит разрешенные для экспорта имена.
--retain-symbols-file=filename
Retain only the symbols listed in the file filename, discarding all others. filename is simply a flat file, with one symbol name per line. This option is especially useful in environments (such as VxWorks) where a large global symbol table is accumulated gradually, to conserve run-time memory. --retain-symbols-file does not discard undefined symbols, or symbols needed for relocations.
You may only specify --retain-symbols-file once in the command line. It overrides -s and -S.
Так что по одному из советов данных в теме ранее, вы вполне можете сделать две разделяемые библиотеки, в каждую из них прилинковать по одной статической библиотеке, сделать для них разный прокси-интерфейс, а все остальное скрыть.

Добавлено через 2 минуты
Цитата Сообщение от drfaust Посмотреть сообщение
А с помощью dlopen() грузить вручную ту, которая нужна, в зависимости от flag
Если у него платформа поддерживает RTLD_LOCAL, то наверное можно и сразу обе загрузить.
0
1970 / 826 / 115
Регистрация: 01.10.2012
Сообщений: 4,965
Записей в блоге: 2
17.04.2023, 10:14  [ТС]
Цитата Сообщение от drfaust Посмотреть сообщение
А с помощью dlopen() грузить вручную ту, которая нужна, в зависимости от flag
Может быть и так что обе нужны (напр первый do_login не прошел).

Цитата Сообщение от DrOffset Посмотреть сообщение
правда он работает только на платформах, где есть GNU Binutils, и это видимо как раз не ваш случай,
Да, не мой

Цитата Сообщение от DrOffset Посмотреть сообщение
Еще (или в дополнение) можно использовать белый список экспортируемых функций, ключ линкера
А вот это РАБОТАЕТ. И там удобная опция в IDE, глотать пыль с ключами не надо

Со списком экспорта утилита nm (для созданной динамической либы) показывает "t" для всех остальных ф-ций (т.е. никто их случайно не схватит), а было "T"

Еще пробовал через objcopy (на моей платформе llvm-objcopy), но не прорвался - опция "префикс для всех" на моей платформе не разрешена, а делать список всех-всех напряжно. Кстати почему 2 (динамических)? Ведь если все скрыто, то одной достаточно, вторая просто статиком
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2023, 10:14
Помогаю со студенческими работами здесь

ошибка java: non-static variable this cannot be referenced from a static context
Помогите решить ошибку, пожалуйста. Искала решение забрать static, но это не сработало. Подчеркивает new Cube(a1) и new RectSolid(c,d,h)...

Как изменить свойство non-static объекта из static метода
Понимаю, что такое не задумано средствами Net Framework, но у меня из-за этого не работает одна фишка, которую я месяц писал, вообщем у...

Как правильно разместить static поверх других static-ов
Есть кнопка, нажимая на которую становится видно статик. проблема в том, что статик отображатеся сзади других статиков и кнопок. как...

Вызов static методов из static класса динамически подключаемой библиотеки, которая неизвестна на момент компиляции
Можете привести пример или указать ссылку, как можно вызвать методы из библиотеки... Весь материал, что я нашел, был связан с...

Обращение к не static базе данных из static-метода
Есть у меня БД .sqlite . Она создаётся из не static метода: public IDbConnection database; public void SetupDb() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru