2011-08-22 3 views
7

내 대학 서버에서 실행하는 실행 파일을 g을 사용하여 ++ 및 전송 내 컴퓨터에서 C++ 프로그램을 컴파일, 나는이 프로그램은 내 컴퓨터에서 잘 실행하고 나는 돈된 libstdC++ GLIBCXX 버전 오류

./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./main) 
./main: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by ./main) 

를 얻을 수 대학 서버에 새 소프트웨어를 설치할 수있는 권한이 없습니다.

어떤 도움이 필요합니까? 감사합니다.

+0

대학의 libstdC++ 버전은 무엇입니까? – phoxis

+0

@phoxis, 3.4.8 세 이상인 것 같습니다. – bdonlan

답변

7

은 집에서 프로그램을 링크 할 때 당신이 공유 라이브러리 (기본 동작)와 같은 표준 라이브러리를 사용하는 것 같다.

실제로 라이브러리를 "링크"하는 대신 링커는 심볼을 해석하고 다른 작업을 수행하며 실제로 라이브러리를 런타임에로드하는 것을 지연합니다.

대학 컴퓨터에서 프로그램을 실행하면 로더 (실제로 프로그램을 메모리에로드하고 메인 스레드를 버리는 프로그램)가 프로그램에 필요한 라이브러리를 찾고로드하려고 시도합니다 (리눅스에서 LD_LIBRARY_PATH 찾기 호기심을 느끼면).

여기서 문제는 집에서 프로그램을 대학에서 가지고있는 것과 같은 버전이 아닌 stdlib 버전과 연결하고 있다는 것입니다. 따라서 로더가 라이브러리를 찾으려고 할 때 실패하면 프로그램을 실행할 수 없습니다.

솔루션 :

가) 이러한 모든 문제 대신 동적 링크의 연결 정적 사용하지 않도록합니다. 이것이 stdlib에서 가능한지 확실하지 않지만 시험해 볼 가치가 있다고 생각합니다. (http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html 및 "-static"플래그를 찾으십시오)

b) 대학 컴퓨터에서 프로그램을 컴파일 해보십시오 그래서 거기 버전을 사용할 것입니다.

c) 거기에 설치된 stdlib 버전을 확인하고 컴파일러 컴퓨터에 동일한 버전을 설치하십시오.

d) stdlib의 홈 버전을 응용 프로그램과 동일한 폴더에 복사 할 수 있습니다.이것은 보통 로더가 환경 변수에 설정된 경로를 찾기 전에 현재 응용 프로그램 폴더에서 공유 라이브러리를 검색하는 경향이 있기 때문에 작동합니다 (Linux)

희망이 있습니다. 여기

P.S : 당신은 공유/동적 라이브러리 http://www.network-theory.co.uk/docs/gccintro/gccintro_25.html

그리고 여기 (http://en.wikipedia.org/wiki/Library_%28computing%29)가 너무 좋은하지만 더 완료되지 라이브러리 설명 대 정적에 좋은 소개가 있습니다. 당신은 서버의 홈 디렉토리의 하위 디렉토리에 /usr/lib/libstdc++.so.6의 버전을 복사 할 수 있습니다

+1

'-static'보다 더 나은 옵션은 전체 프로그램이 아닌 libstdC++에 정적으로 링크하는'-static-libstdC++'옵션입니다. –

4

libstdc++.so.6 버전은 대학 컴퓨터에서 너무 오래된 것입니다. 두 가지 옵션이 있습니다.

  1. 정적으로 -static과 연결됩니다. C++ 라이브러리는 최종 바이너리로 병합됩니다.
  2. 올바른 버전을 홈 디렉토리의 다른 곳으로 복사 한 다음 빌드시에 -rpath /path/to/library/directory을 전달하거나 LD_LIBRARY_PATH 환경 변수가 더 최신 디렉토리가 포함 된 디렉토리를 가리 키도록 참조하십시오 (libstdc++.so.6).
+0

많은 bdonian에게 감사드립니다. 정적 링크는 대학 서버에서 실행될 때 프로그램이 더 느리게 실행되게합니까? – Tarek

+0

@Tarek, 정적 연결에는 여러 가지 장단점이 있지만 실제로 속도 차이가 많이 느껴지지 않을 것이라고 생각합니다. @ bdonian으로 – bdonlan

+0

많은 장단점이 있다고하지만, 당신의 경우에는 주된 것이 크기가 될 것입니다. 정적 링크 된 프로그램에서 라이브러리는 실행 파일 내에 "포함"되어 있기 때문에 정적으로 링크 된 프로그램은 동적으로 링크 된 프로그램보다 큽니다. – thamurath

1

컴파일하려는 플랫폼은 무엇입니까? 즉 '귀하의 컴퓨터'및 '대학 서버'입니까?

정적 연결 옵션을 사용하여 프로그램을 컴파일 해보십시오. 이렇게하면 이미로드 된 모든 lib 종속성과 정적으로 링크 된 실행 파일이 생성됩니다.

건배,

3

, ~/lib 말을 한 후 실행

$ LD_LIBRARY_PATH=$HOME/lib ./main 

을 또는 당신은

$ export LD_LIBRARY_PATH=$HOME/lib 
$ ./main 

그리고 프로그램을 선호하는 경우 시스템이 아닌 개인 라이브러리를로드해야합니다.

관련 문제