0

私が制御できない別の共有ライブラリに依存する共有ライブラリを構築しようとしています。これが私がそれを構築する方法です:

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

したがって、これらのシンボルは私が持っているライブラリでは定義されていません。問題を解決するためにできることはありますか、それともライブラリの提供者に完全に依存していますか? 私が完全に欠けているものはありますか?

前もって感謝します

4

2 に答える 2

0

必要な関数シグネチャが何であるかを理解し、それらのシンボルを定義する独自の .so を構築し、それを使用して未定義のシンボルエラーを回避することができます。あなたが本当に決心しているなら、関数/欠落しているクラスが何をするかをリバースエンジニアリングできるかもしれません。

ただし、現実的には、ライブラリのプロバイダーにこの情報を連絡し、必要なシンボルが定義されたライブラリを入手する必要があります。

于 2014-05-09T17:11:51.893 に答える
0

ライブラリを構築する方法に 2 つの問題がありました。

1) this question undefined reference to symbol のとおり、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
于 2014-05-12T08:52:48.593 に答える