2012-10-27 2 views
1

저는 g ++ 4.6과 g ++ 4.7을 모두 사용하여 늦게 프로그램을 개발해 왔습니다. 저는 현재 많은 C++ 11 기능을 이용하고 있습니다.C++ 11/최신 g ++ 버전 (4.7/4.6)을 사용한 이식성

나는 하위 디렉토리에 프로그램과 함께 libs를 번들링하고 LD_LIBRARY_PATH를 사용할 수 있다고 생각했다. 나는 이것이 내 프로그램이 segfault를 일으키는 것을 발견했다. 내가 좀 더 일찍 시험 했어야 했어. libc.so.6이 번들로 묶여있는 것으로 보입니다 (아마도 다른 것들이지만, 확실히 libc).

이전에는 libs를 설치할 수 없었던이 기술을 사용했지만 잘 작동했지만 libc와 libstdC++를 프로그램과 함께 포함 할 필요가 없었습니다.

이 문제를 해결할 수있는 방법이 있습니까? 아니면 이전 C++/libc/libstdC++ 버전으로 롤백해야합니까? (와 함께 제공되는 코드 변경의 악몽)

+0

항상 C++ 라이브러리를'-static-libstdC++'로 정적으로 링크 할 수 있습니다 ... –

+0

나는 이것을 시도했지만 작동하지 않습니다. 나는 dlopen (예를 들어 getaddrinfo)을 필요로하는 함수를 사용하고 있어야하며 gnutls와 연결되어 있고 정적으로 링크 될 수없는 libs를 사용하는 것으로 보인다. 결과 바이너리는 ldd에 동적으로 링크 된 libstdC++를 보여줍니다. – goji

+0

문제가 libc.so.6 인 경우 gcc 또는 g ++과 관련이 없습니다. –

답변

2

LD_LIBRARY_PATH에 의존하지 마십시오. 테스트 또는 개발에는 사용하지만 프로덕션 배포에는 사용하지 마십시오.

대신 동적 링커가 실행 파일 (또는 예를 들어, 사용과 같은 디렉토리에 공유 libs와 찾을 것을 의미 $ORIGIN를 포함하는 DT_RPATH 태그를 만들 수 '-Wl,-rpath,$ORIGIN'와 연결 '-Wl, -rpath, $ ORIGIN /../ LIB '를 보면 ../lib)

G ++ 4.7로 작성된 프로그램이 있다면 런타임시 GCC 4.7에서 libstdC++. so를 사용해야합니다.

그러나 문제가 libc.so.6에있는 경우 GCC 문제가 아니며 libc를 번들로 사용하지 않는 것이 좋습니다 ... 시스템 libc를 바꾸려고 시도하는 것이 좋습니다.

1

나는 g ++ 4.6 또는 4.7만을 사용한다고 말하고 있지만 둘 다 사용하지는 않습니다. ldconfig는 프로그램이 libc.so의/lib 또는/usr/lib 버전을 실행하도록 만들므로, 다른 프로그램이있는 경우 어떻게 작동하는지 잘 모르겠습니다. 그래서 아마 libc 시스템을 사용해야 만합니다.

다른 사람이 다른 아이디어가있는 경우도 게시하십시오.