2013-05-02 142 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