Как опционально зависеть от общего объекта с gcc? - PullRequest
5 голосов
/ 05 августа 2010

Во-первых, я вообще не знаю, есть ли решение моей проблемы.

У меня следующая ситуация:

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

Теперь мне нужно также сделать общий объект библиотеки фреймворка.Кроме того, зависимости доступны в виде разделяемых библиотек, поэтому нет необходимости в статических ссылках.

Проблема, с которой я столкнулся сейчас:

  • При создании приложения, которое динамически связывается с каркасомбиблиотека Мне нужно либо динамически связать все зависимости с библиотекой фреймворка, либо с приложением.(В противном случае я получаю неопределенные ссылки на жалобы от ld)

Мои вопросы:

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

  • Есть ли способ сделать это без или с минимальными изменениями кода?(переключатели компоновщика / компилятора)

Мне также нужно статическое связывание, как описано в исходной ситуации, чтобы все еще работать.

Дополнительная информация:

  • Операционная система: Linux (Debian Lenny)
  • Компилятор: gcc-4.3

Ответы [ 2 ]

7 голосов
/ 05 августа 2010

Вы можете, но в основном вы должны выполнять всю динамическую библиотеку самостоятельно.то есть dlopen библиотека, а затем ищите нужные символы непосредственно с помощью dlsym.

Это сделает ваш код более сложным, в зависимости от того, насколько интерфейс у вас в библиотеках.1005 *

6 голосов
/ 05 августа 2010

С man ld

- по мере необходимости
нет - не-по мере необходимости

Этот параметр влияет на теги ELF DT_NEEDED для динамических библиотек, упомянутых в командной строке после параметра --as-required. Обычно, компоновщик добавит тег DT_NEEDED для каждой динамической библиотеки, упомянутой в командной строке, независимо от того, является ли библиотека на самом деле нужно. --as-required заставляет тэг DT_NEEDED быть выданным только для библиотеки, которая удовлетворяет ссылке на символ из регулярного объекты, которые не определены в момент, когда библиотека была связана, или, если библиотека не найдена в списках DT_NEEDED других библиотеки, связанные до этого момента, ссылка из другой динамической библиотеки. --no-as-required восстанавливает поведение по умолчанию.

Я сам этим не пользовался, но звучит как то, что вы ищете.

g++ -o your_app -Wl,--as-needed -lframework -la -lb -lc -Wl,--no-as-needed

Редактировать (предложено Ханно)

- символы предупреждения-неразрешенные

Если компоновщик сообщит о неразрешенном символе (см. Опцию --unresolved-symbols), он обычно выдаст ошибку. Эта опция заставляет вместо этого генерировать предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...