2010-03-11 2 views
3

샘플 프로그램을 제대로 연결하는 데 문제가 있습니다 (이 경우 ICU 라이브러리와의 비교). 내가 'make'할 때 모든 것이 잘됩니다. 그러나 나는 그것을 실행할 때 .so의 것을 찾을 수 없다고 말합니다. 나는 그들이/usr/local/lib에 모두 설치되었는지 다시 확인했다. 내가 발견 한 것은/usr/lib 디렉토리에서 찾고있는 것이었다. 거기에서 실제 위치로 심볼릭 링크하면 작동합니다.LIBPATHS가 Makefile에서 사용되지 않고 공유 객체를 찾을 수 없습니다.

내 LIBPATHS가 무시되거나 사용되지 않는 이유는 무엇입니까?

다음은 동적 라이브러리에 대한 경로는 기본적으로 실행 파일에 저장되지 메이크

CC = g++ 

INCPATHS = -I/usr/local/include 

CFLAGS = -c -Wall $(INCPATHS) 

LIBPATHS = -L/usr/local/lib/ 
LIBS = $(LIBPATHS) -licuio -licui18n -licuuc -licuio -licudata 

EXECUTABLE = prog 

print_linking = echo -e "\033[32m" "Linking: $<" "\033[39m" 
print_compiling = echo -e "\033[33m" "Compiling: $<" "\033[39m" 
print_cleaning = echo -e "\033[31m" "Cleaning: `pwd`" "\033[39m" 


all: main 

# [target]: [dependencies] 
# <tab> system command 
main: main.o 
    @$(print_linking) 
    @$(CC) -o $(EXECUTABLE) main.o $(LIBS) >> /dev/null 

main.o: main.cpp 
    @$(print_compiling) 
    @$(CC) $(CFLAGS) main.cpp 

clean: 
    @$(print_cleaning) 
    @rm -rf *.o *~ $(EXECUTABLE) 

답변

2

LIBPATHS은 기호를 해결하기 위해 링크 할 때 라이브러리를 찾을 위치를 링커에 알립니다.

런타임에 로더에게 라이브러리를 찾을 위치를 알려줘야합니다. 컴파일 할 때 일어난 일에 대해 알지 못합니다. 위에서 언급 한 바와 같이 LD_LIBRARY_PATH 변수를 사용하거나 /etc/ld.so.conf과 그 친구를 확인할 수 있습니다.

2

입니다. 당신도 할 수 있습니다 런타임에

  • 사용 LD_LIBRARY_PATH 어디 실행

    에 경로를 저장하는 링크시 동적 라이브러리

    에 대한
  • 사용 -Wl, -R 경로를 검색 할 수있는 경로를 제공하기 위해

1

하나의 해결책은 환경 변수 LD_LIBRARY_PATH에/usr/local/lib를 추가하는 것입니다. .profile 또는 .cshrc에서이 작업을 수행 할 수 있습니다.

라이브러리의 전체 경로를 실행 파일에 저장하는 링커를 얻을 수도 있습니다.

두 솔루션 모두 서로 다른 사용자 및/또는 다른 시스템에서 실행 가능한 것을 사용하는 것과는 다른 장단점이 있습니다.

관련 문제