2013-05-02 18 views
6

プロジェクトをコンパイルしようとしています。それは正常にコンパイルされます。私のmakeコマンドは、ステータスコード0で終了し、エラーは表示されません。lddはコンパイルによってライブラリが見つかりませんでした。

しかし、プロジェクトは機能していません。ldd -d <file>を実行すると、見つからないライブラリが2つあることがわかります。

>ldd -d output_file.so 
    linux-gate.so.1 => (0xf77e0000) 
    libvstdlib_srv.so => not found 
    libtier0_srv.so => not found 
    libm.so.6 => /lib/libm.so.6 (0xf7760000) 
    libdl.so.2 => /lib/libdl.so.2 (0xf775b000) 
    libc.so.6 => /lib/libc.so.6 (0xf75a9000) 
    /lib/ld-linux.so.2 (0x46e4a000) 
undefined symbol: pfVectorNormalize  (output_file.so) 
undefined symbol: _Z12VectorAnglesRK6VectorR6QAngle  (output_file.so) 
undefined symbol: pfSqrt  (output_file.so) 
undefined symbol: __cxa_guard_acquire (output_file.so) 
undefined symbol: __cxa_guard_release (output_file.so) 
undefined symbol: _Z6ConMsgPKcz (output_file.so) 
undefined symbol: Warning  (output_file.so) 
undefined symbol: __dynamic_cast  (output_file.so) 
undefined symbol: _Z11ConColorMsgRK5ColorPKcz (output_file.so) 
undefined symbol: Error (output_file.so) 
undefined symbol: AssertValidStringPtr (output_file.so) 
undefined symbol: _AssertValidWritePtr (output_file.so) 
undefined symbol: _AssertValidReadPtr (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv121__vmi_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv120__si_class_type_infoE  (output_file.so) 
undefined symbol: _ZTVN10__cxxabiv117__class_type_infoE (output_file.so) 
undefined symbol: __gxx_personality_v0 (output_file.so) 

これら2つのライブラリーは、ファイルの実際の場所へのシンボリックリンクを設定されています

... 
lrwxrwxrwx 1 Andy Andy 62 May 2 12:30 libtier0_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libtier0_srv.so 
lrwxrwxrwx 1 Andy Andy 64 May 2 12:30 libvstdlib_srv.so -> /home/dev/sdks/hl2sdk-ob-valve/lib/linux/libvstdlib_srv.so 
-rw-r--r-- 1 Andy Andy 5444 May 2 11:53 Makefile 
... 

gccコマンドが実行さ

gcc -I/home/dev/sdks/hl2sdk-ob-valve/public/game/server -I. -I.. -ICEntity -Isdk -I/home/dev/project1/hl2sdk-ob-valve/public -I/home/dev/sdks/hl2sdk-ob-valve/public/engine -I/home/dev/sdks/hl2sdk-ob-valve/public/tier0 -I/home/dev/sdks/hl2sdk-ob-valve/public/tier1 -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib -I/home/dev/project1/mmsource-central/core -I/home/dev/project1/mmsource-central/core/sourcehook -I/home/dev/project1/sourcemod-central/public -I/home/dev/project1/sourcemod-central/public/sourcepawn -I/home/dev/project1/sourcemod-central/core project1_output/sdk/smsdk_ext.o project1_output/extension.o project1_output/CTrackingProjectile.o project1_output/CSentryRocket.o project1_output/CProjectileRocket.o project1_output/CProjectileArrow.o project1_output/CProjectileFlare.o project1_output/CProjectilePipe.o project1_output/CProjectileSyringe.o project1_output/CEntity/CEntity.o project1_output/CEntity/CEntityManager.o project1_output/CEntity/CPlayer.o /home/dev/project1/hl2sdk-ob-valve/lib/linux/tier1_i486.a libvstdlib_srv.so libtier0_srv.so -m32 -lm -ldl -static-libgcc -shared -o project1_output/output_file.so

私の質問がありますされています。 )1.なぜ2つのライブラリがシンボリックリンクされていても見つからないのですか? 2.)未定義シンボルはgccコマンドに含まれているmathlibパッケージの一部です。 -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlibこれらは含まれているにもかかわらず、なぜ未定義ですか?

c++は私の言いたい言語ではありません。私はMakefilesについては危険であるとは十分に知っていますが、実際には何も修正していないので、十分な情報がないと謝ります。私は必要に応じてより多くを提供することができます。

+1

「/ dev」にSDK _really_が置かれていますか? –

+0

@JoachimIsakssonいいえ!私はパスを隠していて、 '/ dev'についても考えなかった。私は '/ home/dev'を使うように質問を更新しましたので、誰もそれを混乱させません。 – Andy

答えて

5

ライブラリファイルは共有オブジェクトです。つまり、実行時まで解決されません。 lddがそれらを見つけるためには(あなたはLinuxや他のUnixの変種を前提にして)ライブラリをあなたのLD_LIBRARY_PATHに追加する必要があります(別のパスenvがありますが、今考えることはできません)。 lddはライブラリを見つけることができるはずです。

2

diverscuba23が言及しているように、ライブラリがあるパスをLD_LIBRARY_PATHに追加する必要があります。ライブラリは、あなたがプログラムを実行しているのと同じディレクトリ内にあることが必要となる。この場合

LD_LIBRARY_PATH =.:$LD_LIBRARY_PATH ./yourProgram 

:あなたがそうのようなプログラムを実行するときにこれを行うのは簡単、かつ非永続的な方法は、それを指定されます。

11

私はちょうどこの問題に遭遇しましたが、同じ問題がありましたが、別の解決策がありました。

LD_LIBRARY_PATHを使用すると、実際に動作します。ビルド環境で独自のテストを行っているのであれば問題ありませんが、このような場合以外は避けてください。 LD_LIBRARY_PATHが悪い理由はここで、それについては私よりもはるかに多くを知っている人の記事です:

http://xahlee.info/UnixResource_dir/_/ldpath.html

ことは、実行時にある、設定LD_LIBRARY_PATHが働いていることからもわかるように、IS何が起こりましたプログラムで共有ライブラリlibtier0_srv.soが見つかりませんでした。最初にすべてのプログラムの変数をグローバルに設定して/home/dev/sdks/hl2sdk-ob-valve/lib/linux/を表示するのではなく、ディレクトリをランタイムライブラリ検索パスに追加する必要があります。あなたはオプションld

-rpath /home/dev/sdks/hl2sdk-ob-valve/lib/linux/

、リンカを渡すことによってこれを行います。あなたはオプション

-Wl,-rpath,/home/dev/sdks/hl2sdk-ob-valve/lib/linux/ldに上記のオプションを渡すためにgccを伝え

を追加することによって、あなたが投稿あなたのgccコマンドでこれを行うことができます。

+0

はい、これは、環境変数を設定する 'sledgehammer'アプローチよりも優れています。 – drlolly

関連する問題