我正在尝试编译项目.它编译成功.我的make
命令以状态代码退出,0
并且没有显示错误.
但是,该项目不起作用,当我运行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)
Run Code Online (Sandbox Code Playgroud)
这两个库设置为指向文件实际位置的符号链接:
...
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
...
Run Code Online (Sandbox Code Playgroud)
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有足够的了解是危险的,但并不是真的要解决任何问题,所以如果这些信息不够,我会道歉.我可以根据需要提供更多.
Goe*_*ens 14
我偶然发现了这个问题,遇到了同样的问题,但却有了不同的解决方案.
事实上,使用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
.
库文件是共享对象,这意味着它们在运行时才会被解析.为了让ldd找到它们(假设Linux或其他Unix变体),你需要将库的路径添加到LD_LIBRARY_PATH(还有另一个可以使用的路径env,但我现在想不到它)然后ldd应该能够找到这个库.