2017-01-25 6 views
0

まず、この1つをかなり検索しましたが、同じ状況で質問を見つけることができませんでした。コンパイルとリンクを行った後のランタイム "シンボル検索エラー"

私は、64ビットマシン上で共有オブジェクトとして32ビットプラグインを構築し、cpp-redisを使用しています。 cpp-redisはうまく構築され、cmakeツールチェインを使って32ビットを強制し、ビルド時に.oファイルをチェックし、32ビットであることを確認しました。

私は非常に基本的なプログラム(これはプラグインなので、1つのメインソースファイルとホストアプリケーションと対話するための余分なlibで構成されています)をコンパイルしてリンクしました。ホストアプリにプラグインをロードし実行する際に

は、私がもって迎えています:私は、CPP-RedisのDIR-Lとを有するリンカーのパスに追加したとして、私はかなり困惑

symbol lookup error: plugins/samp-redis.so: undefined symbol: _ZN9cpp_redis16redis_subscriberC1ERKSt10shared_ptrINS_7network10io_serviceEE 

-lとライブラリは、ここに私のコンプ/リンク行です:

エラーなしで正常に動作

g++ -fpermissive -fPIC -m32 -std=c++11 -c -O3 -w -D LINUX -I$(SDK_DIR) -I$(SDK_DIR)/amx -I/usr/local/include/cpp_redis (source .cpp files...) 
g++ -v -Wall -O2 -m32 -fshort-wchar -s -shared -L/usr/local/lib/ -lcpp_redis -o $(OUTFILE) *.o 

(SDK_DIRが.C/hでファイルの私のホストアプリのSDK、かなり小さく、最小セットです)、私はリンク・スタッグを走らせたフラグをチェックするために-vを指定してeを正しく入力してください。

(読みやすくするためのいくつかの改行を追加しました)

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure 
     -v 
     --with-pkgversion='Debian 4.9.2-10' 
     --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs 
     --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ 
     --prefix=/usr 
     --program-suffix=-4.9 
     --enable-shared 
     --enable-linker-build-id 
     --libexecdir=/usr/lib 
     --without-included-gettext 
     --enable-threads=posix 
     --with-gxx-include-dir=/usr/include/c++/4.9 
     --libdir=/usr/lib 
     --enable-nls 
     --with-sysroot=/ 
     --enable-clocale=gnu 
     --enable-libstdcxx-debug 
     --enable-libstdcxx-time=yes 
     --enable-gnu-unique-object 
     --disable-vtable-verify 
     --enable-plugin 
     --with-system-zlib 
     --disable-browser-plugin 
     --enable-java-awt=gtk 
     --enable-gtk-cairo 
     --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre 
     --enable-java-home 
     --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 
     --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 
     --with-arch-directory=amd64 
     --with-ecj-jar=/usr/share/java/eclipse-ecj.jar 
     --enable-objc-gc 
     --enable-multiarch 
     --with-arch-32=i586 
     --with-abi=m64 
     --with-multilib-list=m32,m64,mx32 
     --enable-multilib 
     --with-tune=generic 
     --enable-checking=release 
     --build=x86_64-linux-gnu 
     --host=x86_64-linux-gnu 
     --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.9.2 (Debian 4.9.2-10) 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.9/32/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/ 
    :/lib/../lib32/ 
    :/usr/lib/../lib32/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../ 
    :/lib/ 
    :/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-Wall' '-O2' '-m32' '-fshort-wchar' '-s' '-shared' '-L/usr/local/lib/' '-o' 'samp-redis.so' '-shared-libgcc' '-mtune=generic' '-march=i586' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/collect2 
    -plugin /usr/lib/gcc/x86_64-linux-gnu/4.9/liblto_plugin.so 
    -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper 
    -plugin-opt=-fresolution=/tmp/cc0Lo5po.res 
    -plugin-opt=-pass-through=-lgcc_s 
    -plugin-opt=-pass-through=-lc 
    -plugin-opt=-pass-through=-lgcc_s 
    --sysroot=/ 
    --build-id 
    --eh-frame-hdr 
    -m elf_i386 
    --hash-style=gnu 
    -shared 
    -o samp-redis.so 
    -s /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.9/32/crtbeginS.o 
    -L/usr/local/lib/ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/32 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32 
    -L/lib/../lib32 
    -L/usr/lib/../lib32 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../.. 
    -lcpp_redis amxplugin2.o amxplugin.o main.o 
    -lstdc++ 
    -lm 
    -lgcc_s 
    -lc 
    -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/4.9/32/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/crtn.o 

私はリンク段階を誤解または静的リンクするのですか?私はC++をやってからしばらくしてきました...私はすべてPythonに関するもので、最近はGoです!


EDIT:この出力の-W,--no-undefined結果とコンパイル

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper 
Target: x86_64-linux-gnu 
Configured with: ../src/configure 
    -v 
    --with-pkgversion='Debian 4.9.2-10' 
    --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs 
    --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ 
    --prefix=/usr 
    --program-suffix=-4.9 
    --enable-shared 
    --enable-linker-build-id 
    --libexecdir=/usr/lib 
    --without-included-gettext 
    --enable-threads=posix 
    --with-gxx-include-dir=/usr/include/c++/4.9 
    --libdir=/usr/lib 
    --enable-nls 
    --with-sysroot=/ 
    --enable-clocale=gnu 
    --enable-libstdcxx-debug 
    --enable-libstdcxx-time=yes 
    --enable-gnu-unique-object 
    --disable-vtable-verify 
    --enable-plugin 
    --with-system-zlib 
    --disable-browser-plugin 
    --enable-java-awt=gtk 
    --enable-gtk-cairo 
    --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre 
    --enable-java-home 
    --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 
    --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 
    --with-arch-directory=amd64 
    --with-ecj-jar=/usr/share/java/eclipse-ecj.jar 
    --enable-objc-gc 
    --enable-multiarch 
    --with-arch-32=i586 
    --with-abi=m64 
    --with-multilib-list=m32,m64,mx32 
    --enable-multilib 
    --with-tune=generic 
    --enable-checking=release 
    --build=x86_64-linux-gnu 
    --host=x86_64-linux-gnu 
    --target=x86_64-linux-gnu 
Thread model: posix 
gcc version 4.9.2 (Debian 4.9.2-10) 
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.9/32/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/ 
    :/lib/../lib32/ 
    :/usr/lib/../lib32/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/ 
    :/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../ 
    :/lib/ 
    :/usr/lib/ 
COLLECT_GCC_OPTIONS='-v' '-Wall' '-O2' '-m32' '-fshort-wchar' '-s' '-shared' '-L/usr/local/lib/' '-o' 'samp-redis.so' '-shared-libgcc' '-mtune=generic' '-march=i586' 
/usr/lib/gcc/x86_64-linux-gnu/4.9/collect2 
    -plugin /usr/lib/gcc/x86_64-linux-gnu/4.9/liblto_plugin.so 
    -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper 
    -plugin-opt=-fresolution=/tmp/ccOq8qY8.res 
    -plugin-opt=-pass-through=-lgcc_s 
    -plugin-opt=-pass-through=-lc 
    -plugin-opt=-pass-through=-lgcc_s 
    --sysroot=/ 
    --build-id 
    --eh-frame-hdr 
    -m elf_i386 
    --hash-style=gnu 
    -shared 
    -o samp-redis.so 
    -s /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.9/32/crtbeginS.o 
    -L/usr/local/lib/ 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/32 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32 
    -L/lib/../lib32 
    -L/usr/lib/../lib32 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9 
    -L/usr/lib/gcc/x86_64-linux-gnu/4.9/../../.. 
    -Bstatic 
    --no-undefined 
    -lcpp_redis amxplugin.o amxplugin2.o main.o 
    -lstdc++ 
    -lm 
    -lgcc_s 
    -lc 
    -lgcc_s /usr/lib/gcc/x86_64-linux-gnu/4.9/32/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../lib32/crtn.o 
/usr/bin/ld: cannot find 
    -lgcc_s 
/usr/bin/ld: cannot find 
    -lgcc_s 
collect2: error: ld returned 1 exit status 
makefile:15: recipe for target 'build' failed 
make: *** [build] Error 1 

どうやらそれはそれが何であれgcc_sを見つけることができませんか? s =静的?

私はgccのLIBSを探してみました:

$ find /usr/ -name libgcc* 
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_s.so 
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_eh.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/x32/libgcc_s.so 
/usr/lib/gcc/x86_64-linux-gnu/4.9/x32/libgcc_eh.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/x32/libgcc.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/32/libgcc_s.so 
/usr/lib/gcc/x86_64-linux-gnu/4.9/32/libgcc_eh.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/32/libgcc.a 
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_s_32.so 
/usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_s_x32.so 
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_s.so 
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc_eh.a 
/usr/lib/gcc/x86_64-linux-gnu/4.8/libgcc.a 
/usr/lib/x86_64-linux-gnu/libgccpp.so.1 
/usr/lib/x86_64-linux-gnu/libgccpp.so.1.0.3 

はまだldconfigの検索を行うにはlibgcc.so.1という名前のファイルを示しています

$ sudo /sbin/ldconfig -p | grep libgcc 
    libgccpp.so.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libgccpp.so.1 
    libgcc_s.so.1 (libc6,x32) => /usr/libx32/libgcc_s.so.1 
    libgcc_s.so.1 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgcc_s.so.1 
    libgcc_s.so.1 (libc6) => /usr/lib32/libgcc_s.so.1 

これが理由だろうか?私が掘っておこうよう

し、エラーをグーグルでは、いくつかの結果が表示されます...

+0

デフォルトでは、g ++は共有ライブラリを構築する際に未解決のシンボルを持つことができ、実行時にマニフェストされます。明示的にすべてのシンボルを定義するように、共有ライブラリを "-Wl、 - no-undefined"とリンクしてみてください。たとえば、リンクする追加ライブラリがありません。 – axalis

+0

Btw。シンボルがcpp_redisライブラリから来ているようですが、アプリケーションが実行されているときにライブラリがLD_LIBRARY_PATHにあることを確認してください(またはWindowsのPATHにあります)。プラグインを実行してもcpp_redisライブラリーを見つけてロードできない場合があります。 – axalis

+0

ありがとうございました@axalis!未解決のシンボルを許可するg ++の部分は、私が疑問に思っていたものであり、ドキュメントで見つけることができなかったものでした。私は後でそれを試してみます。私はなぜリンクステージがうまく走ったのか、ランタイムがうまくいかなかったのか混乱していました。 – Southclaws

答えて

0

それは共有ライブラリとリンク可能であるためにあなたが静的ライブラリとしてcpp_redisを構築する場合であっても、それは-fPICフラグすなわちしてコンパイルする必要がありますコードは再配置可能でなければなりません。あなたの場合のように、リンカーは共有ライブラリをリンクするときに互換性のないコードを黙って無視します。 .soファイルでnmを実行すると、cpp_redisのシンボルがプラグインに解決されているかどうかを確認できます。

アップデートに応じて、プラグインをcpp_redisではなく-W,--no-undefinedにリンクする必要があります。おそらく、ホストプログラムからのシンボルが欠落しているので、失敗するでしょう。しかし、cpp_redisのシンボルが欠落しているかどうかを確認することができます。

+0

実行可能ファイルによって.soがロードされるホストアプリケーションを意味する場合、私はそれを制御できません。 – Southclaws

+0

この実行ファイルは、プラグインでは使用できません。この特定の問題を修正しても、プラグインには実行可能ファイル自体に定義されている関数がありません。ライブラリではありません。 – Slava

+0

ホストプログラムは何年も存在していて、プラグインが豊富に用意されています。私のアプリにcpp-redisコードをコンパイルすることができないと言っているのであれば、私はプラグインの横にcpp-redisをインストールするようにユーザーに伝えなければならないでしょうか? – Southclaws

関連する問題