Windows에서 g ++ 4.6 (mingw) 및 -std = C++ 0x를 사용하고 (mingw와 함께 사용하기 위해 공급 업체에서 제공 한) 제 3 자 정적 라이브러리와 연결하면 응용 프로그램이 올바르게 작동합니다. 내가 g-4.7.2 (mingw)로 바꿔서 -std = C++ 11을 사용할 수있게되었을 때, 응용 프로그램은 잘 만들었지 만 실행할 때 충돌이납니다. 공급 업체가 제공 한 라이브러리에 대한 호출을 주석 처리하면 충돌이 발생하지 않습니다. 라이브러리 공급 업체에 대한 고객 지원을 요청했고 이것이 지원되지 않는다고 들었습니다.g ++ 4.7로 업그레이드 (C++ 11 지원) : 모든 ABI 비 호환성?
최신 버전의 g ++ 컴파일러로 갈 때 내 질문에 "ABI 비 호환성이 있습니까?" 이전 버전과 호환되지 않습니까? 최신 버전의 컴파일러가 기존 및 기존 타사 정적 라이브러리에서 작동하지 않습니까?
Windows (mingw) 플랫폼에서만 발생합니다. 리눅스에서 잘 작동합니다.
나는이에 대한 자세한 정보를 추가했습니다 :
사람이 Chilkat의는 MinGW C++ 소스 g로 컴파일 ++ 4.7.2 = C++ (11) 컴파일 옵션 -std와 Windows 응용 프로그램에서 정적 라이브러리를 사용 했습니까? Chilkat API에 액세스하면 앱이 충돌합니다 (예 : CkString 객체가 인스턴스화 됨). g ++ 4.6.2에서 잘 작동합니다 (여기서 std = C++ 0x를 사용합니다). g ++ 4.7.2 Linux에서이 프로그램은 정상적으로 작동합니다. 4.6.2에서 4.7.2로 이동할 때 ABI 비 호환성이 있다면 Linux에서도 작동하지 않아야합니다. 맞습니까? 정적 라이브러리 chilkat-9.3.2/lib/libchilkat.a가 MINGW 치료에 사용하기 위해 벤더에 의해 만들어졌고 나머지 프로그램이 최신 g ++ 컴파일러로 컴파일 된 경우 왜 이것이 ABI의 MINGW 특정 변경 사항입니까?
#include <windows.h> #include <stdio.h> #include <CkString.h> int main(int argc, char *argv[]) { printf("test chilkat\n"); CkString str1; printf("test done\n"); }
gdb -i=mi test_chilkat.exe Starting program: test_chilkat.exe [New Thread 4704.0x1a44] Program received signal SIGSEGV, Segmentation fault. 0x00404442 in CkObject::CkObject()()
예. http://gcc.gnu.org/gcc-4.7/changes.html을 참조하십시오. 이것은 (특히 std :: list와 std :: pair에서) 라이브러리 전용 변경이라고 생각하며 C++ 11 모드에만 영향을 미칩니다. – dajames
글쎄, GCC 4.7.2는 실제로 GCC 4.6과 ABI 호환성을 회복시킨다. 그래서 OP가 여기에서 겪고있는 것은 아마도 다른 것입니다. –
Linux ABI 호환성 및 Windows ABI 호환성은 완전히 다른 짐승입니다. 일반적으로 모든 종류의 ABI를 유지하기 위해 Windows GCC 릴리스를 고려하지 않습니다. – rubenvb