2013-05-02 3 views
6

프로젝트를 컴파일하려고합니다. 그것은 성공적으로 컴파일합니다. 내 make 명령이 상태 코드 0과 함께 종료되고 오류가 표시되지 않습니다.ldd가 컴파일로 라이브러리를 찾지 못했습니다.

그러나 프로젝트가 작동하지 않으며 ldd -d <file>을 실행하면 찾을 수없는 두 개의 라이브러리가 있음을 보여줍니다. 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

입니다

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

:

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

이 두 라이브러리

는 파일의 실제 위치로 심볼릭 링크를 설정됩니다 : ) 1. 두 라이브러리가 심볼릭 링크되어 있어도 찾을 수없는 이유는 무엇입니까? 2. 정의되지 않은 기호는 gcc 명령에 포함 된 mathlib 패키지의 일부입니다. -I/home/dev/sdks/hl2sdk-ob-valve/public/mathlib 포함되지 않은 이유는 무엇입니까?

c++은 내가 선택한 언어가 아니며 위험 할 수도있는 Makefiles에 대해 충분히 알고 있지만 실제로는 아무 것도 고쳐야하지 않으므로이 정보가 충분하지 않은 경우 사과드립니다. 필요에 따라 더 많이 제공 할 수 있습니다.

+1

부수적으로 SDK는 _really_가'/ dev'에 있습니까? –

+0

@JoachimIsaksson 아니요! 나는 경로를 모호하게하고'/ dev'에 대해서도 생각조차하지 않았다. 이 질문은 누군가를 혼동하지 않도록'/ home/dev'를 사용하도록 업데이트했습니다. – Andy

답변

5

라이브러리 파일은 공유 개체이므로 런타임 전까지는 해결되지 않습니다. ldd가 그들을 찾기 위해 (리눅스 또는 다른 유닉스 변형을 가정 할 때) LD_LIBRARY_PATH에 라이브러리 경로를 추가해야합니다 (사용 가능한 다른 경로 인 env가 있지만 지금은 생각할 수 없습니다). 그리고 나서 ldd가 라이브러리를 찾을 수 있어야합니다.

2

diverscuba23이 언급 했으므로 라이브러리가있는 경로를 LD_LIBRARY_PATH에 추가해야합니다.

LD_LIBRARY_PATH =.:$LD_LIBRARY_PATH ./yourProgram 

을 라이브러리가 프로그램을 실행하는 동일한 디렉토리 내에있을 필요가있다이 경우 : 당신과 같이 프로그램을 실행할 때이 일을 쉽게, 비 영구적 인 방법을 지정하는 것입니다.

11

나는 이것에 비틀 거리며, 동일한 문제가 있지만 다른 해결책이 있습니다.

LD_LIBRARY_PATH를 사용하면 실제로 작동합니다. 빌드 환경에서 자신의 테스트를위한 것이라면 괜찮습니다.하지만 이와 같은 경우 외에는 피하는 것이 좋습니다. 여기에 대해 나보다 더 많이 아는 사람의 글이며, LD_LIBRARY_PATH가 나쁜 이유 : 설정 LD_LIBRARY_PATH 근무한다는 사실에서도 알 수 있듯이

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

가있다 무슨 일이라고 런타임에 프로그램이 공유 라이브러리 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

관련 문제