Неразрешенный символ g++ при связывании RedHat и SUSE

Привет, я искал тему об ошибке связывания - Ошибка:: неопределенная ссылка на XXX,

Мой код компилируется в SUSE, но не в REDHAT, буду признателен, если кто-нибудь может пролить свет на это. Я не нашел другой пост, конкретно соответствующий моей ситуации (может быть, я пропустил), есть очень близкий (Связывание с динамической библиотекой с зависимостями). Я пытался, однако я все еще натыкаюсь на камни.

Фон: у меня есть child.cpp, который использует parent.cpp, поэтому я включил parent.h в child.cpp.

символ (XXX) в родительском элементе содержится в libA.so

>> nm -C libA.so | egrep XXX
000000000013eb0 T NS::XXX(char const*, char const*, char const*)

Есть еще одна библиотека, которая использует родителя, назовем ее libB.so.

>> nm -C  libB.so | egrep XXX
000000000000000 U NS::XXX(char const*, char const*, char const*)

но libB.so имеет ссылку на libA.so

>> ldd libB.so | grep libA.so
libB.so => /export/data/NS/lib/libA.so (0x00007fbc0a9bf000)

Когда я ссылаюсь на SUSE, ниже компилируется

g++ child.cpp -o child -I. -L. -lB

Когда я ссылаюсь на RHEL, он жалуется на undefine XXX, поэтому мне также нужно сделать libA

g++ child.cpp -o child -I. -L. -lB -lA

Я не понимаю, почему есть разница. Я попробовал варианты, предложенные в (Связывание с динамической библиотекой с зависимостями). Мне все еще нужно связать libA при компиляции.

-Wl,--unresolved-symbols=ignore-in-shared-libs
-Wl,--as-needed

person Kelvin Lai    schedule 24.09.2018    source источник
comment
Покажите свой код как минимально воспроизводимый пример или, по крайней мере, улучшите свой вопрос, чтобы объяснить, что на самом деле XXX и libA.so и libB.so являются. Прочтите также Как писать общие библиотеки Дреппера.   -  person Basile Starynkevitch    schedule 24.09.2018
comment
libA и libB — это только сторонние библиотеки, они для меня прозрачны. Что я знаю, так это функцию API NS::XXX в parent.h.   -  person Kelvin Lai    schedule 24.09.2018
comment
Без дополнительных деталей вы не получите никакой помощи. Подумайте о том, чтобы пожаловаться (или спросить) у поставщика этих сторонних библиотек. Кстати, обратные кавычки в ваших командах подозрительны. Возможно, вы могли бы связать только libB.so или использовать разные команды в SuSE и RedHat. Возможно, вам следует спросить, как определить дистрибутив, на котором вы работаете (и это делает другой вопрос)   -  person Basile Starynkevitch    schedule 25.09.2018
comment
Какие еще подробности могут помочь? Действительно, я понятия не имею, как замена XXX на getName(), getCounter() и т. д. поможет, я поставил XXX, потому что компилятор жаловался на все ссылки, определенные в parent.h. У меня было 30+ ошибок. Самое подозрительное, что на SUSE компилируется просто libB, а мне нужно libA + libB на RedHat. Если XXX не определено в libB, но является динамической ссылкой на libA, в каком возможном направлении мне следует искать?   -  person Kelvin Lai    schedule 25.09.2018
comment
Если XXX не определено в libB.so. Что означает 000000000000000 U NS::XXX(char const*, char const*, char const*)?   -  person Kelvin Lai    schedule 25.09.2018
comment
libB.so ссылается на /export/data/NS/lib/libA.so, но ваши командные строки используют -L.. . и /export/data/NS/lib ссылаются на один и тот же каталог?   -  person Maxim Egorushkin    schedule 25.09.2018