В зависимости от общей библиотеки, которая имеет неопределенный символ

Я пытаюсь создать общую библиотеку, которая зависит от другой общей библиотеки, которую я не могу контролировать. Вот как я это делаю:

g++ -fPIC -Wall -Wextra -O2 -g -fpermissive -Wl,--no-allow-shlib-undefined -Wl,--no-undefined \
    -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -I/opt/softkinetic/DepthSenseSDK/include \
    -L/opt/softkinetic/DepthSenseSDK/lib \
    -lDepthSense -lDepthSensePlugins -lturbojpeg -c -o NativeDs325.o \
     NativeDs325.cpp

g++ -shared -o libds325.so NativeDs325.o

Шаг сборки проходит нормально, но когда я загружаю свою библиотеку, она выдает undefined symbol error, Когда я смотрю в библиотеки, вот что я нашел

$ldd -d libds325.so
    linux-vdso.so.1 =>  (0x00007fff94bfe000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f727167d000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f7271467000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f72710a6000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7270daa000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f7271ba5000)
    undefined symbol: _ZTIN10DepthSense9ExceptionE  (./libds325.so)
    undefined symbol: _ZTIN10DepthSense16EventHandlerBaseE  (./libds325.so)
    undefined symbol: _ZN10DepthSense7ContextD1Ev   (./libds325.so)
    undefined symbol: _ZN10DepthSense9DepthNodeD1Ev (./libds325.so)

И когда я заглядываю в библиотеку, я зависим и от которой у меня нет контроля:

$nm -D libds325.so | grep _ZTIN10DepthSense9ExceptionE
    U _ZTIN10DepthSense9ExceptionE
$nm -D libds325.so | grep _ZTIN10DepthSense16EventHandlerBaseE                                                                                                  
    U _ZTIN10DepthSense16EventHandlerBaseE

Таким образом, эти символы не определены в библиотеках, которые у меня есть. Могу ли я что-нибудь сделать, чтобы решить мою проблему, или я полностью зависим от поставщика библиотеки? Я что-то упускаю полностью?

заранее спасибо

2 ответа

Решение

У меня были две проблемы при создании библиотеки:

1) Согласно этому вопросу неопределенная ссылка на символ, даже если nm указывает, что этот символ присутствует в общей библиотеке, библиотеки должны быть перечислены после объектов, которые их используют, так:

g++ NativeDs325.cpp -fPIC -Wall -Wextra -O2 -g -fpermissive -Wl,--no-allow-shlib-undefined -Wl,--no-undefined \
-I$JAVA_HOME/include -I$JAVA_HOME/include/linux -I/opt/softkinetic/DepthSenseSDK/include \
-L/opt/softkinetic/DepthSenseSDK/lib \
-lDepthSense -lDepthSensePlugins -lturbojpeg -c -o NativeDs325.o \

2) При связывании мне нужно было добавить библиотеки для включения в итоговую разделяемую библиотеку:

g++ -shared -o libds325.so NativeDs325.o -L/opt/softkinetic/DepthSenseSDK/lib \
 -lDepthSense -lDepthSensePlugins -lturbojpeg

Вы можете попытаться выяснить, какие сигнатуры функций вам нужны, создать свой собственный.so, определяя эти символы, и использовать его, чтобы обойти неопределенную ошибку символов. Если вы действительно полны решимости, вы сможете перепроектировать, что делают функции / отсутствующие классы.

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

Другие вопросы по тегам