2013-09-21 4 views
6

Boost C++ 라이브러리의 최신 SVN 버전이 설치된 Ubuntu 13.04 시스템이 있습니다. Boost 설치는 시스템 고유의 gcc 버전, v4.7.3을 사용하여 구축되었습니다. 나는 크게 광범위하게 Boost를 사용하며, 컴파일 할 때 매우 잘 작동합니다. gcc; Boost.Thread (아래에서 더 자세히 설명 할 것입니다)를 포함하여 많은 것을 사용했지만 문제는 없습니다.gcc가 내장 된 Boost를 Intel C++ 컴파일 된 프로그램에 연결할 때 정적 초기화 중 Segfault

설치된 Boost 라이브러리와 링크 된 Intel C++ 컴파일러 (개인적으로 v13.x 시리즈의 몇 가지 다른 버전 사용)를 사용하여 프로그램을 작성하려고하면 내 문제가 발생합니다. 그렇게하면 프로그램을 시작하자마자 세분화 오류가 발생합니다. Boost.Thread 라이브러리의 정적 초기화 중에 발생하는 것으로 보입니다.

#include <boost/version.hpp> 
#include <boost/thread.hpp> 

int main() 
{ 
    boost::this_thread::sleep(boost::posix_time::seconds(1)); 
} 

내가 컴파일 ++ 인텔 C를 사용하여 : 내가 말했듯이 나는 결과 프로그램을 실행할 때

icpc test.cc -lboost_thread -lboost_system -I/path/to/boost/inc/dir -L/path/to/boost/lib/dir 

가, 나는 거의 즉시 세그먼트 폴트를 얻을 다음은 간단한 예제 프로그램입니다. 다음과 같이 gdb를 통해, 세그먼트 폴트의 관점에서 스택 추적은 다음과 같습니다

#0 0x00007ffff79b6351 in boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()() from ./libboost_thread.so.1.55.0 
#1 0x00007ffff79b02e1 in _GLOBAL__sub_I_thread.cpp() from ./libboost_thread.so.1.55.0 
#2 0x00007ffff7de9876 in call_init ([email protected]=0x7ffff7ff9a10, [email protected]=1, 
    [email protected]=0x7fffffffe0b8, [email protected]=0x7fffffffe0c8) at dl-init.c:84 
#3 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>, 
    argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55 
#4 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8) 
    at dl-init.c:133 
#5 0x00007ffff7ddb68a in _dl_start_user() from /lib64/ld-linux-x86-64.so.2 
#6 0x0000000000000001 in ??() 
#7 0x00007fffffffe391 in ??() 
#8 0x0000000000000000 in ??() 

을하지 매우 계몽, 그러나 그것은 명확하게 libboost_thread.so의 초기화 중에 죽어. 내가 디버그 기호를 포함 부스트를 다시한다면, 나는 약간 더 나은 사진을 얻을 :

#0 shared_count (r=..., this=0x7ffff7bbc5f8 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep+8>) 
    at ./boost/smart_ptr/shared_ptr.hpp:328 
#1 shared_ptr (this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>) at ./boost/smart_ptr/shared_ptr.hpp:328 
#2 exception_ptr (ptr=..., this=0x7ffff7bbc5f0 <boost::exception_ptr boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>()::ep>) 
    at ./boost/exception/detail/exception_ptr.hpp:53 
#3 boost::exception_detail::get_static_exception_object<boost::exception_detail::bad_exception_>() at ./boost/exception/detail/exception_ptr.hpp:130 
#4 0x00007ffff79b02e1 in __static_initialization_and_destruction_0 (__initialize_p=<optimized out>, __priority=<optimized out>) at ./boost/exception/detail/exception_ptr.hpp:143 
#5 _GLOBAL__sub_I_thread.cpp(void)() at libs/thread/src/pthread/thread.cpp:767 
#6 0x00007ffff7de9876 in call_init ([email protected]=0x7ffff7ff9a10, [email protected]=1, [email protected]=0x7fffffffe0b8, [email protected]=0x7fffffffe0c8) at dl-init.c:84 
#7 0x00007ffff7de9930 in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=0x7ffff7ff9a10) at dl-init.c:55 
#8 _dl_init (main_map=0x7ffff7ffe268, argc=1, argv=0x7fffffffe0b8, env=0x7fffffffe0c8) at dl-init.c:133 
#9 0x00007ffff7ddb68a in _dl_start_user() from /lib64/ld-linux-x86-64.so.2 
#10 0x0000000000000001 in ??() 
#11 0x00007fffffffe391 in ??() 
#12 0x0000000000000000 in ??() 

그것은 문제가 발생하는 원인, 내가 진행하는 방법을 잘 모르겠어요되는 정적 무엇을/전역 객체 나에게 불분명하다. 나는 Boost 버전과 여러 버전의 Intel C++ 컴파일러를 v13.x 시리즈에서 사용하여이 동작을 복제했습니다.이 버전은 현재 액세스 할 수있는 유일한 릴리즈입니다. 모든 컴파일러 순열을 시도했습니다. 즉, 부스트를 gccicpc으로 작성했으며 둘 다 함께 테스트 응용 프로그램을 구축했습니다. Boost가 gcc으로 구축되고 내 테스트 응용 프로그램이 icpc을 사용하여 빌드 된 유일한 순열은 실패합니다. 다른 모든 경우에 테스트 응용 프로그램이 성공적으로 실행됩니다.

  • 은 왜 그냥 icpc하고 하루에 전화를 사용하여 부스트를 재 구축 : 그와

    당신은 명백한 대답을 주도 할 수 말했다? 내 접근법을 고려할 때 그 접근법은 효과적 이었지만 내 소프트웨어를 빌드하려면 icpc을 사용하려는 고객이 있습니다. 이 같은 고객들은 Linux 배포판에 Boost 패키지가 설치되어있을 가능성이 높습니다. 그들은 패키지를 생성하는 데 사용 된 빌드 환경을 제어하지 못합니다 (어쨌든 gcc을 사용하여 컴파일 된 것입니다). 따라서 그러한 혼합 컴파일러 구성을 지원할 수 있다면 최적 일 것입니다.

정적 초기화 문제를 해결하는 방법에 대한 권장 사항이있는 사람이 있습니까? 당신이 다른 g++이있는 경우

+0

icpc을 모르지만 pthread와 연결을 시도 했습니까? 단지 야생의 추측. – PeterT

답변

4

이 ... 긴 샷,하지만 PATH, 부스트 라이브러리를 구축 없애거나 icpc-gxx-name /usr/bin/g++을 전달하는 데 사용되는 것보다. (인텔 컴파일러는 사용하고 있다고 생각하는 GCC 버전에 적응합니다. -gxx-name을 사용하면 강제로 문제를 해결할 수 있습니다.)

아마도 도움이되지 않았을 것입니다.

Intel 작곡가 XE 2013 SP1 이전에는 Ubuntu 13.04가 지원되지 않습니다. 컴파일러 버전 14.0.0. "System Requirements" section of the Release Notes을보고 same section for the last 13.x release과 비교하십시오.

인텔은 GCC와의 링크 호환성을 확실히 목표로합니다. 지원되는 Linux 버전을 새로 설치할 때이 문제를 재현 할 수있는 경우 지원 티켓을 제출하여 문제를 해결할 수 있어야합니다.

+0

팁 주셔서 감사합니다. 현재 v13.x에 대한 액세스 권한 만 있으므로 지원되는 플랫폼에서 복제하고 도움이되는지 확인하려고 노력할 것입니다. –

+1

지원되는 플랫폼 인 Ubuntu 12.04를 사용하여 v13.0.1에서이 문제를 복제 할 수있었습니다. 인텔에 버그로보고해야한다고 생각합니다. –

+2

@JasonR : 그럴 것입니다. 보고서를 읽는 첫 번째 사람은 "레벨 1"의 무인 항공기가 될 것이므로 자신의 목표는 실제 버그 일 수 있다는 것을 확신시켜 체인을 밟을 것입니다. 짧게 유지하고, 최소한의 테스트 케이스를 제공하고, 문자 그대로 "재현 단계"를 제공하십시오. Ubuntu 12.04는 LTS 릴리스 이후 좋았습니다. 행운을 빕니다 :-). – Nemo