2013-11-27 2 views
3

나는 Windows에서 Linux로 이식 된 응용 프로그램을 가지고 있지만, 모든 것이 잘되었지만 ... 우리 고객은 데비안 3.1 (sarge)에서 실행중인 응용 프로그램을 강제 실행 할 수 없습니다. 시스템과 나는 새로운 gcc를 사용하는 것을 선호한다. (내가 보존하고 싶은 몇몇 C++ 11 구조가있다.) 앞으로 테스트 및 .so 파일을 위해 실행 파일을 만들고 싶습니다.전체 프로그램을 정적으로 링크

나는 procect를 정적으로 컴파일하기로 결정했다.

나는 실행하면

g++ -static -o prog obj/sublib1/file1.o obj/sublib1/file2.o obj/sublib2/file1.o obj/sublib2/file2.o (...) -L../somedir -s -lsomestaticlib 

내가 오류 ko를 얻을 :

Linux linux-zfaz.site 3.11.6-4-desktop #1 SMP PREEMPT Wed Oct 30 18:04:56 UTC 2013 (e6d4a27) i686 i686 i386 GNU/Linux 

이 문제는 함께 아마도 :

/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lm 
/usr/lib/gcc/i586-suse-linux/4.8/../../../../i586-suse-linux/bin/ld: cannot find -lc 

시스템은 오픈 수세 13.1 32 비트, 끝나면 uname -a입니다 수학 라이브러리 및 C 라이브러리 두 라이브러리의 동적 버전은/lib 디렉토리에 있습니다.

(아마 문제가되지 않습니다 내가 코드 :: 블록을 사용하여 구축을 위해 노력하지만, 한 문제는 내가 터미널로 이동했습니다 발생했을 때)

나는이 라이브러리의 정적 버전을 설치해야합니까? 방법?

답변

0

최근 버전의 g ++를 사용하는 경우 -static-libstdc++ 옵션 만 있으면됩니다. 이렇게하면 g ++ 라이브러리가 정적으로 링크되지만 (일반적으로 정적 버전이 아닌) 시스템 라이브러리가 동적으로 링크됩니다. (이 경우 -static을 사용하지 마십시오.)

+0

이 해결책은 오래된 데비안에서 오류가 발생합니다.'./prog : /lib/libgcc_s.so.1 : version 'GCC_4.2.0'not found (./sarmata_C++ 필요)'. '-static-libstdC++'와'-static-libgcc' 둘 다 사용합니다 :'./prog : 재배치 오류 : ./prog : undefined symbol : _ZNSt8time_getIwSt19istreambuf_iteratorIwSt11char_traitsIwEEE2idE' – entro

+0

당신은 적어도 -static_libgcc를 원하지 않을 것입니다. 리눅스 시스템 (아마도 아무 데나). 다양한 역사적 이유 때문에, 내가 틀리지 않는다면,'libgcc'는 전통적인'libc '도 포함합니다. 이것은 정적으로 링크되어서는 안됩니다. 나머지에 관해서는, 나는 또한 버전 관리에 문제가있었습니다; 나는 g ++과 libstdC++가 설치된 방식과 관련이 있다고 생각하지만, 후속 작업을하고 알아낼 기회가 없었습니다. ('-static-libstdC++'에 대한 지원은 매우 최근 버전이므로, g ++/libstdC++의 이전 버전은 지원하지 않을 수도 있고 올바르게 지원하지 않을 수도 있습니다.) –

0

glibc-devel-static 패키지를 설치해야합니다. 적용 가능한 경우 @jameskanze의 대답이 더 좋은 옵션입니다.

+0

이 답변은 아마 작동 할 것입니다. 'FATAL : kernel too old'라고하면, C++ 11 기능을 없애고 데비안 3.1에서 다시 컴파일하려고 할 필요가있는 것 같습니다. – entro