2010-04-26 1 views
5

리눅스 표준베이스 http://www.linuxfoundation.org/collaborate/workgroups/lsb에서 LSB C++ 컴파일러로 프로그램을 빌드하고 싶습니다. 프로그램은 gcc 4.4 버전으로 빌드 된 Boost 라이브러리에 따라 다릅니다. 컴파일이 실패합니다. LSB C++ 컴파일러로 Boost 라이브러리를 구축 할 수 있습니까? 또는 기존의 gcc 버전으로 Boost 라이브러리를 구축 할 수 있습니까? 어떤 버전을 권장합니까? 최종 목표는 대부분의 Linux 배포판에서 실행 가능한 제 3 자 Boost 라이브러리를 얻는 것입니다.LSB C++ 컴파일러로 빌드 부스트

일반적으로 Boost 라이브러리에 따라 C++ 클로즈드 소스 애플리케이션을 개발하여 Linux 배포판에서 더 나은 바이너리 호환성을 얻으려면 어떻게해야할까요?

+0

언제부터 LSB가 컴파일러입니까? 필자는 이것이 Linux 배포판에서 어떤 라이브러리와 유틸리티를 설치하고 사용할 수 있는지에 대한 스펙 일 뿐이라고 생각했습니다. (다른 라이브러리와 유틸리티는 그곳에 의존 할 수 있습니다.) –

+0

Michael Aaron Safyan : LSB 프로젝트는 GCC 대신 사용할 수있는 자체 C++ 컴파일러를 제공하며 모든 Linux 배포판과 호환되는 바이너리를 생성해야합니다. 실제로이 컴파일러를 사용하여 내 코드를 작성하면 좋은 결과를 얻을 수 있습니다. 그러나, 내 프로젝트에 사용되는 타사 라이브러리에 문제가 있습니다. –

+0

@Michael, LSB는 일련의 사양이지만 작업 그룹에서는 이러한 사양과 일치하는 프로그램을 개발하는 데 도움이되는 도구도 제공합니다. 여기 http://ldn.linuxfoundation.org/lsb/porting-lsb-demo와 http://www.linuxfoundation.org/collaborate/workgroups/linux-standard-base-lsb/lsb-sdk-403 –

답변

3

LSB C++ 컴파일러는 실제로 컴파일러가 아닙니다. lsbc++ 실행 파일은 시스템에 설치된 GCC 컴파일러의 래퍼입니다 (실제 컴파일러는 --lsb-cxx 옵션을 통해 제어 할 수 있습니다). 네이티브 gcc 컴파일러 대신 LSB 래퍼를 호출 할 수 있도록 시스템을 구축 할 가능성이 높습니다.

그래서 LSB 컴파일러가 언어 구문을 컴파일 할 수 없다는 문제가 발생할 수 있습니다. 대신 링크 문제가 있습니다.

예를 들어, LSB 컴파일러는 LSB에 속하지 않는 한 기본적으로 코드가 연결된 모든 공유 라이브러리를 삭제합니다. BOOST가 그러한 라이브러리에 의존하면 연결 오류가 발생할 수 있습니다. 이것은 LSBCC_SHAREDLIBS 환경 변수를 통해 제어 할 수 있지만 제품과 함께이 라이브러리를 제공해야합니다.

또 다른 문제는 LSB가 GCC 컴파일러 릴리스보다 떨어지고 BOOST가 컴파일러의 모든 어두운 구석에 들어갈 수 있다는 것입니다. 내가 아는 한, GCC 4.4는 충분히 테스트되지 않았기 때문에 4.3 컴파일러로 시험해 보는 것이 좋습니다.

Google에서는 LSBCC를 사용하여 건물을 향상시키는 것과 관련이 없으므로 문제를 해결할 수 있다면 문제에 대한 답변으로 자신의 경험을 공유하십시오.

+0

나는 Boost를 g ++ 파일을 lsbC++에 대한 링크로 대체하려고 시도했다. 그 결과 많은 라이브러리를 컴파일하지 못했습니다. 내가 GCC 4.3 버전을 시도 할 것입니다,이 정보를 주셔서 감사합니다. –

+0

@Alex, 나는 링크를 바꾸는 것과 함께'lsbC++'을 실제 컴파일러로 지적 했으므로 재발하지 않았 으면 좋겠다 :-D. 어쨌든 LSB 메일 링리스트에서 도움을 받으려고 할 수도 있습니다 : https://lists.linux-foundation.org/mailman/listinfo/lsb-discuss 메일 링리스트 형식은 StackOverflow가 아닌 ​​에러 로그로 구체적인 오류를 논의하는 데 더 적합합니다 . –

+0

GCC 4.3을 사용하면 타사 라이브러리에 lsbC++ 컴파일러를 사용할 수 없습니다. 그러나 LSB 응용 프로그램 검사기로 몇 가지 결과가 있습니다. 누락 된 라이브러리를 내 패키지에 추가함으로써, Boost ASIO 라이브러리를 사용하여 49 개의 50 가지 Linux 배포판 호환성을 얻을 수있었습니다. 성공의 종류 ... 도와 줘서 고마워. –

6
내가 최근에 다른 사람에게 쓸모가 있다는 경우에,이 작업을 수행하기 위해 전화 했어

이 내가 다음 단계는 다음과 같습니다

  • 다운로드 및 버전을 다운로드 LSB SDK
  • 설치 부스트하고/opt/부스트/부스트로 추출 < 버전 > (내가 1.43을 사용)
  • libbz2-dev가 설치되어 있는지 확인하십시오.
cd /opt/boost/boost_<version> 
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu 
  • 편집 /opt/boost/boost_<version>/project-config.jam 및 파일의 상단 라인
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ; 

를 추가로

  • 부트 스트랩. bjam이 그 구성을 읽는 다른 파일들 중 하나에 선언을 사용한다면, 어떤 파일을 읽고 있는지 알기 위해서 --debug-configuration을 전달할 수 있습니다.

    • 실행
    ./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install 
    

    내가 파이썬이나 작업 MPI 라이브러리 중 하나를 얻으려고,도 내가 ICU는 대신 Boost.Regex 라이브러리 작업을 진행하려고하지 않았다. 후자는 아마도 LSB 도구 세트로 ICU 라이브러리의 정적 버전을 빌드하는 경우 일 것입니다.

    -fPIC은 32 비트 Linux의 경우 반드시 필요하지는 않지만 64 비트 Linux의 경우 공유 라이브러리에 정적 라이브러리를 연결하려는 경우 필요합니다.

    최종 결과는 /opt/boost/lib의 이진 파일이어야하고 /opt/boost/include의 헤더 여야합니다. 물론 자신의 취향에 맞게 접두어를 수정할 수 있습니다. LSB에 모든 코드를 포팅하기 전에해야 할 일이 아직 많으므로 인증 과정이 얼마나 잘 진행되고 있는지보고 할 수는 없습니다.

  • +0

    흥미 롭습니다, 감사합니다. 현재 바이너리 호환성 문제를 해결하기 위해 자동 도구를 사용하고 있습니다. 나중에 참조 할 수 있도록 귀하의 답변을 알려 드리겠습니다. –