2013-05-02 38 views
6

我試圖編譯項目。它編譯成功。我的make命令以狀態碼0退出,並且沒有顯示錯誤。ldd說庫找不到編譯成功完成

但是,該項目不能正常工作,並且當我運行ldd -d <file>時,它顯示我找不到兩個庫。

>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) 

這兩個庫建立符號鏈接到文件的實際位置:

... 
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.)未定義的符號是mathlib包的一部分,包含在gcc命令中。 -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib爲什麼這些是不確定的,儘管包括在內?

c++不是我的選擇語言,我對Makefiles有足夠的瞭解是危險的,但並不是真的要解決任何問題,所以我很抱歉如果這不是足夠的信息。我可以根據需要提供更多信息。

+1

作爲一個方面說明,SDK _really_被放置在'/ dev'中嗎? – 2013-05-02 18:58:24

+0

@JoachimIsaksson不!我模糊了路徑,甚至沒有考慮'/ dev'。我已經更新了使用'/ home/dev'的問題,所以這不會讓任何人感到困惑。 – Andy 2013-05-02 19:09:37

回答

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工作可以看出,是在運行時,您的程序無法找到共享庫libtier0_srv.so。首先,您應該將目錄添加到運行時庫搜索路徑中,而不是全局設置所有程序的變量以查看/home/dev/sdks/hl2sdk-ob-valve/lib/linux/。這可以通過使用選項

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

ld,鏈接器做到這一點。你可以用你貼你gcc命令做到這一點,通過添加選項

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

告訴gcc通過以上ld的選項。

+0

是的,這比設置環境變量的'大錘'方法更好。 – drlolly 2017-05-24 15:11:41