Ldd says library not found completed successfully compilation

I am trying to compile a project. It compiles successfully. My make terminates with status code 0 and no errors are displayed.

However, the project does not work, and when I run ldd -d <file> , it shows that I have two libraries that are not found.

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

These two libraries are configured as symbolic links to the actual file location:

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

The gcc command is executed:

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

My questions: 1.) Why are these two libraries not found, although they are symbolically connected? 2.) The undefined characters are part of the mathlib package, which is included in the gcc command. -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib Why should they be undefined even though they are included?

c++ not my language of choice, and I know enough about Makefiles to be dangerous, but really don't fix anything, so I apologize if this is not enough. I can provide more as needed.

+6
source share
3 answers

Library files are shared objects, which means that they will not be allowed until launch. In order for ldd to find them (assuming Linux or another version of Unix), you will need to add the library path to your LD_LIBRARY_PATH (there is another env path that you can use, but I can’t think about it right now), and then ldd must be able to find the library.

+5
source

I just stumbled upon this, had the same problem, but a different solution.

Using LD_LIBRARY_PATH will really work. And this is normal if it is for your own testing in your build environment, but you should try to avoid this, moreover, for such a case. Here is an article by someone who knows far more than me why LD_LIBRARY_PATH is bad:

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

What happened, as can be seen from the fact that the LD_LIBRARY_PATH setting works, is that at run time your program could not find the shared library libtier0_srv.so . Instead of globally setting a variable for all programs to look at /home/dev/sdks/hl2sdk-ob-valve/lib/linux/ , you must first add the directory to the search path of the runtime library. You do this by passing an option

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

to ld , linker. You can do this with the gcc command you sent by adding the option

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

which tells gcc to pass the option above ld .

+11
source

As diverscuba23 said, you need to add the path where your library is on your LD_LIBRARY_PATH. An easy and fickle way to do this indicates it when you start the program as follows:

 LD_LIBRARY_PATH =.:$LD_LIBRARY_PATH ./yourProgram 

In this case, the library should be in the same directory in which you run the program.

+2
source

Source: https://habr.com/ru/post/944152/


All Articles