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 시리즈에서 사용하여이 동작을 복제했습니다.이 버전은 현재 액세스 할 수있는 유일한 릴리즈입니다. 모든 컴파일러 순열을 시도했습니다. 즉, 부스트를 gcc
및 icpc
으로 작성했으며 둘 다 함께 테스트 응용 프로그램을 구축했습니다. Boost가 gcc
으로 구축되고 내 테스트 응용 프로그램이 icpc
을 사용하여 빌드 된 유일한 순열은 실패합니다. 다른 모든 경우에 테스트 응용 프로그램이 성공적으로 실행됩니다.
- 은 왜 그냥
icpc
하고 하루에 전화를 사용하여 부스트를 재 구축 : 그와당신은 명백한 대답을 주도 할 수 말했다? 내 접근법을 고려할 때 그 접근법은 효과적 이었지만 내 소프트웨어를 빌드하려면
icpc
을 사용하려는 고객이 있습니다. 이 같은 고객들은 Linux 배포판에 Boost 패키지가 설치되어있을 가능성이 높습니다. 그들은 패키지를 생성하는 데 사용 된 빌드 환경을 제어하지 못합니다 (어쨌든gcc
을 사용하여 컴파일 된 것입니다). 따라서 그러한 혼합 컴파일러 구성을 지원할 수 있다면 최적 일 것입니다.
정적 초기화 문제를 해결하는 방법에 대한 권장 사항이있는 사람이 있습니까? 당신이 다른 g++
이있는 경우
icpc을 모르지만 pthread와 연결을 시도 했습니까? 단지 야생의 추측. – PeterT