다른 C 표준으로 컴파일된 개체를 안전하게 연결할 수 있습니까?
다음에서 세 개의 컴파일된 개체(A, B, C)가 있다고 가정합니다. 동일한 컴파일러 버전. 이들은 각기 다른 C 표준인 C 11, C 14 및 C 17로 컴파일되었습니다. 그러나 헤더는 모두 C 11로 작성되었으며 모든 버전에서 의미 체계가 변경되지 않은 구문을 사용했습니다.
GCC 고려 사항
GCC의 경우 이러한 개체의 조합을 연결하는 것은 안전한. 표준 버전(즉, -std 옵션)은 동일한 버전의 GCC로 빌드된 경우 개체가 ABI와 호환되므로 관련이 없습니다.
그러나 다른 GCC 버전으로 컴파일된 개체가 새 버전의 불안정한 기능을 사용하는 경우 문제가 발생합니다. GCC 지원이 완료되기 전의 C 표준입니다. 예를 들어, GCC 4.9 및 5로 컴파일된 객체를 -std=c 11로 연결하면 C 11 지원이 GCC 4.x에서 실험적이었기 때문에 문제가 발생할 수 있습니다. 마찬가지로 GCC 7 및 8의 개체를 -std=c 17로 연결하면 실험적인 C 17 지원이 발전하면서 문제가 발생할 수 있습니다.
반대로 다음 개체의 모든 조합은 작동합니다.
C 03 지원이 안정적이므로 C 03 구성 요소는 모든 객체에서 호환됩니다. 개체 E와 F는 안정적인 C 11 버전을 사용하고 개체 D는 C 11 기능을 사용하지 않습니다. 개체 F의 C 17 기능은 C 03 또는 C 11 구성 요소만 공유하므로 다른 개체에 영향을 주지 않습니다. GCC 8 및 -std=c 17을 사용하여 네 번째 개체 G를 컴파일하려면 C 17 기호 호환을 보장하기 위해 동일한 버전으로 F를 다시 컴파일해야 합니다(또는 F에 연결하지 않음).
libstdc .so를 사용하는 프로그램의 경우 공유 라이브러리인 경우 최소한 객체를 컴파일하는 데 사용된 GCC 버전만큼 새로운 버전이어야 합니다. std::string을 사용하는 객체 간의 호환성을 위해 모든 객체는 동일한 문자열 구현으로 컴파일되어야 합니다. 원래 구현에는 -D_GLIBCXX_USE_CXX11_ABI=0을 사용하고 새 구현에는 -D_GLIBCXX_USE_CXX11_ABI=1을 사용하세요.
위 내용은 서로 다른 C 표준으로 컴파일된 개체를 안전하게 연결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!