Перекрестное связывание для ARM / QNX терпит неудачу с косвенными / транзитивными зависимостями - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь скомпилировать простой проект для QNX / ARM, который состоит из основного исполняемого файла и двух общих библиотек, liba и libb.

main зависит только от liba и не использует ничего из libb ввсе.либа зависит от либб.Таким образом, цепочка зависимостей: main -> liba -> libb.Следовательно, libb является косвенной / транзитивной зависимостью main.liba.so находится в подкаталоге liba /, libb.so находится в подкаталоге libb /.

Я связываю main следующим образом:

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o -L$TARGET/lib -Llibb -Lliba -la

Как видите, из-задве строки -L, компоновщик не должен иметь проблем с поиском как libb, так и liba.

Когда я компилирую это с помощью цепочки инструментов QNX / ARM, я получаю ошибку:

ntoarm-ld: warning: libb.so, needed by liba/liba.so, not found (try using -rpath or -rpath-link)

Использование straceподтверждает, что ld никогда даже не заглядывает в каталог libb /, несмотря на то, что это указано с помощью -L.

Почему он не просматривает здесь каталоги -L?

1 Ответ

0 голосов
/ 08 марта 2012

-lb отсутствует!L указывает путь, а l фактическую библиотеку.Добавьте -lb в конце вашей команды сборки:

qcc -Vgcc_ntoarmv7le -Wl,--no-undefined -lang-c++ -o linktest main.o \
-L$TARGET/lib -Llibb -Lliba -la -lb

Если вы хотите устранить эту зависимость во время сборки, рассмотрите возможность использования libb через время выполнения динамическая загрузка из liba с использованием dlopen () .

ОБНОВЛЕНИЕ:

Как указано tmcguire , поведение косвенного связывания дляразделяемые библиотеки варьируются от компоновщика к компоновщику.Согласно этой статье , ответственный параметр ld равен --no-copy-dt-needed-entries (иногда его называют --no-add-needed, который в последних gcc выпусках (> 4.5?) Включен по умолчанию.

Еще один интересный вариант: --as-needed:

Флаг --as-needed передается компоновщику GNU (GNU ld). Флаг указывает компоновщику связывать в создаваемом двоичном файле только библиотеки, содержащие символы на самом делеиспользуется самим двоичным файлом. Этот двоичный файл может быть либо конечным исполняемым файлом, либо другой библиотекой.

Дополнительное чтение: здесь и здесь .

...