단일 실행 파일을 개발할 때 다른 C ++ 컴파일러 및 언어 버전 사용


15

우리 회사는 위성 통신을 위해 크고 복잡한 소스 코드를 구매할 것입니다.

이 코드는 C ++로 코딩되어 있으며 코드를 구매 한 코드와 단일 실행 단위로 연결하여 C ++로 코드를 추가합니다.

  • 구매 한 코드를 개발하는 데 사용한 것과 동일한 컴파일러 및 동일한 컴파일러 버전을 사용해야합니까?

  • 구매 한 코드와 동일한 버전의 C ++를 사용해야합니까? 2014를 사용하지 않는 경우, 우리는 _might_의 일부 기능을 사용하려고하지만 다른 버전을 혼합하는 데 문제가있을 수는 없습니다.

이론 상으로는 물론 언어 버전은 중요하지 않지만 컴파일러의 버전이 다르면 서로 다른 객체 코드가 생성되어 타이밍 차이 등이 발생할 수 있습니다.

우리는 무엇을 알고 있어야합니까?


7
소스 코드를 구입하는 것뿐만 아니라 (자격을 갖춘 사람이) 일부 코드를 지원하기를 바랍니다.
Basile Starynkevitch

1
실제로, 우리는. 물론 공급 업체에 대해서도이 질문을했습니다. 그러나 나는 이것이 여기서 좋은 토론 포인트가 될 것이라고 생각했으며 앞으로 다른 사람들에게 좋은 참고 자료가 될 것이라고 생각했습니다.
Mawg에 따르면 모니카 복원은

2
지원되지 않는 컴파일러를 사용하여 타사 코드를 컴파일하거나 다른 컴파일러를 사용하여 코드의 다른 부분을 컴파일하는 것에 대해 이야기하고 있습니까? 그들을 연결)? 아니면 질문의 일부를 결정하고 있습니까?
jpmc26

3
언어 버전도 중요 할 수 있습니다. gcc.gnu.org/wiki/Cxx11Abi 호환성 (이전) 컴파일러 버전 및 ABI의 작은 차이점 목록을 참조하십시오 . 다시 말해, 동일한 컴파일러이지만 다른 c ++ 언어 설정 (c ++ 03 s c ++ 11)이 중요 할 수 있습니다.
André

2
그리고 MSVC에서는 일반적으로 (동적) 라이브러리 경계를 넘어 표준 라이브러리 객체를 전달하는 것이 안전하지 않습니다. 예를 들어 stackoverflow.com/q/5661738/417197
André

답변:


9

구매 한 코드를 개발하는 데 사용한 것과 동일한 컴파일러 및 동일한 컴파일러 버전을 사용해야합니까?

때에 따라 다르지.

컴파일러는 ABI를 대상으로하는 코드를 생성합니다. 일부는 일반적인 ABI를 사용하고 있습니다 (예를 들어 실수하지 않은 경우 clang ++ 및 g ++ 대상이 Itanium ABI라고 부름)-그렇게하지 못하게하는 버그가있을 수 있습니다-객체 코드를 사용할 수 있어야합니다 동일한 프로그램에서 둘 다 (물론 동일한 버전의 ABI를 대상으로하는 버전을 사용한다고 가정). 컴파일러 버전에서도 마찬가지입니다. 일부는 다른 버전보다 동일한 ABI를 유지하기 위해 더 많은주의를 기울입니다. 분명히, 그들은 모두 언젠가 ABI 변경이 필요하며, 호환되지 않는 방식으로 변경해야 할 수도 있습니다. 언어 표준 선택과 같은 일부 설정은 ABI 선택에 영향을 줄 수 있습니다.

그런 다음 표준 라이브러리의 문제가 있습니다. 컴파일러 (또는 동일한 컴파일러의 다른 버전) 자체는 동일한 ABI를 사용할 수 있지만 표준 라이브러리는 호환되지 않을 수 있습니다 (clang ++와 같은 일부 컴파일러는 여러 표준 라이브러리와 함께 사용할 수 있음). 작동하게하려면 인터페이스에서 사용되는 내용에 따라 달라질 수 있습니다.

다시 말해서, 당신은 당신이 속한 특정 사건에 대한 정보를 파고 찾아야합니다. 어떤 종류의 정보를 찾아야하는지의 시작점과 예로써, 여기 libstdc ++ (g ++가 사용하는 라이브러리)가 제공하는 정보가 있습니다. 일부 구성에서는 clang ++)


10
ABI는 응용 프로그램 바이너리 인터페이스 =
사이먼 B

2
이 답변은 객체 코드의 호환성에 관한 것입니다. OP는 소스 코드를 구매하고 있습니다 .
모니카와의 가벼운 경주

7
@LightnessRacesinOrbit이 질문은 다른 컴파일러를 사용하여 단일 실행 파일을 생성하는 것에 대해 이야기합니다. "이것은 하나의 컴파일러 (아마도 '지원되는 것')로 타사 코드를 컴파일하고 다른 컴파일러 (아마도 새로운 컴파일러)로 자체 코드를 컴파일하는 것을 의미합니다." (이것은 분명히 OP가 요구하는 것을 이해하는 것입니다. 다른 방식으로 읽으면 OP에게 명확하게 해달라고 요청할 수 있습니다.) 그 가능성이나 다른 유사한 것들에서 객체 코드의 호환성은 매우 관련이있는 것으로 보입니다.
jpmc26

1
@ jpmc26 : "이것은 분명히 OP가 요구하는 OP를 이해하는 것입니다. 다르게 읽으면 OP에게 명확하게 요구할 수 있습니다." OP는 그들의 회사가 "매우 복잡한 소스 코드를 구매할 것"이라고 밝혔다. 또한 "다른 버전의 컴파일러가 다른 객체 코드를 생성하여 타이밍 차이를 유발할 수 있음"과 같은 문구를 사용하여 구매 한 코드를 다른 툴체인으로 컴파일 할 때 변경 사항이 무엇인지 묻습니다. 나는 거기에 해석의 여지가 많다고 생각하지 않습니다!
Monica와의 가벼움 경주

8

구매 한 코드를 개발하는 데 사용한 것과 동일한 컴파일러 및 동일한 컴파일러 버전을 사용해야합니까? 구매 한 코드와 동일한 버전의 C ++를 사용해야합니까?

이것은 주로 기술적 질문이 아닙니다. 계약서에 쓴 내용에 대한 법적 질문입니다. 소프트웨어 공급 업체가 해당 환경에서 사용할 수 있도록 보증 버전을 제공하는지 확인하십시오 . 그렇지 않으면 항상 다른 컴파일러, 컴파일러 버전 또는 언어 버전에서 문제가 발생할 위험이 있습니다.

이것은 구성 요소 또는 그 일부를 폐쇄 소스로 구매할 때 특히 중요합니다. 공급 업체가 현재 컴파일러 환경에서 구성 요소를 사용할 수 있다고 보장하더라도 향후 새로운 컴파일러 버전으로 전환하려는 경우 업데이트를 제공 할 것입니까? 전체 소스 코드에 액세스 할 수없는 경우 호환성 문제를 직접 해결하는 데 많은 도움이되지 않을 것입니다. 그렇기 때문에 소프트웨어를 구매해야 할뿐만 아니라 공급 업체와의 장기 유지 보수 계약을 고려해야합니다.


이것은 실제로 꽤 좋은 조언입니다!
T. Sar-복원 모니카

실제로는 늦었지만 너무 늦었습니다. Basile의 의견을 언급하면서 공급 업체에 대해서도이 질문을했습니다. 하지만 그것은 여기에 좋은 토론 점, 그리고 미래에 다른 사람에 대한 좋은 미래의 참조가 될 것이라고 생각
Mawg는 분석 재개 모니카 말한다

4

우리 회사는 위성 통신을위한 크고 복잡한 소스 코드를 구매할 것입니다. 이 코드는 C ++로 코딩되어 있으며 코드를 구매 한 코드와 단일 실행 단위로 연결하여 C ++로 코드를 추가합니다.

잘 들린다!

구매 한 코드를 개발하는 데 사용한 것과 동일한 컴파일러 및 동일한 컴파일러 버전을 사용해야합니까?

일반적으로 말하면 필요하지 않습니다. C ++의 목적은 이러한 종류의 것들에 대한 추상화 역할을하는 것이므로 잘 작성된 C ++ 프로그램은 원래 작성자와 마찬가지로 툴체인에서도 컴파일되며 결과 프로그램은 동일한 결과를 얻게됩니다. 다른 컴파일러는 다른 점에 능숙하기 때문에 성능이 다를 수 있지만 프로그램의 기본 동작은 바뀌지 않아야합니다.

그러나 잘못 작성된 소프트웨어는 구현 별 동작 또는 정의되지 않은 동작에 의존 할 수 있습니다. 내장 유형 또는 플랫폼의 엔디안에 대해 가정 할 수 있습니다. 잘 작성된 소프트웨어라도 선택한 툴체인에서 사용할 수없는 비표준 확장에 의존하는 것 외에는 선택의 여지가 없을 수도 있습니다. 원래 프로젝트.

궁극적으로, 당신은 소스 코드가 작성된 소스를 제작자 / 공급자에게 요청해야합니다. 예를 들어 Visual Studio 2015에 대해 특별히 작성되었다고 주장하고 Windows API 기능이 필요하다면 아마도 그 점을 고려해야합니다. 그러나 이식 가능한 표준 C ++이라고 주장하는 경우 원하는 컴파일러를 사용하십시오. 구매 계약에 공급 업체가 거짓말을했을 때 무료로 도움을받을 수 있도록 지원 계약이 포함되어 있는지 확인하십시오.

구매 한 코드와 동일한 버전의 C ++를 사용해야합니까? 그것은 2014를 사용하지 않을 경우, 우리는 할 수 그것의 일부 기능을 사용하기를 원하지만 다른 버전을 혼합 몇 가지 문제가있을 수 있습니다하지 않는 경우.

아마. 아마도.

C ++ 03은 대부분 순방향 호환되므로 코드가 C ++ 03이면 문제가 없을 것입니다. (일부 조정이 필요할 수 있습니다.)

그러나 C ++ 11 및 C ++ 14에 도입 된 기능은 이전 버전과 호환되지 않으므로 공급 업체가 C ++ 11 람다를 사용하고 C ++ 03 컴파일러에서 코드를 작성하려고하면 작동하지 않습니다.

이론 상으로는 물론 언어 버전은 중요하지 않지만 컴파일러의 버전이 다르면 서로 다른 객체 코드가 생성되어 타이밍 차이 등이 발생할 수 있습니다.

물론. 코드가 예상 결과를 얻기 위해 특정 구현에 많이 의존하는 경우 책임을지고이를 사용자에게 알리는 것은 공급 업체의 책임입니다. 우리는 현실 세계에 살고 있기 때문에 부지런히 먼저 질문하는 것이 좋습니다.

그리고 나는 다른 사람들이 말한 것을 반향 할 것입니다 : 당신이 어떤 종류의 지원 수단을 가지고 있는지 확인하십시오. 그래서 그들이 의도적 으로든 그렇지 않든 이러한 질문에 대한 답변을 잘못 표현했을 경우 결과 비용을 부담하지 않습니다.


주목할만한 점 : 링크는 C ++ 사양에 완전히 포함되어 있지 않습니다. 코드가 여러 적합한 컴파일러로 컴파일 될 수 있지만 코드를 서로 연결하여 작동한다고 보장 할 수는 없습니다.
Cort

1
@CortAmmon : 결과 배포의 모든 구성 요소를 ABI를 공유하는 툴체인으로 컴파일해야합니다. ABI 표준은 C ++의 범위를 벗어납니다. 나는 OP가 툴 체인 믹싱에 대해 묻고 있다고 생각하지 않습니다.
Monica와의 가벼움 경주

2

코드를 링크하지 않고 컴파일 된 객체 파일을 링크합니다.

이 경우 예, 다른 C ++ 컴파일러 (또는 디버그 / 릴리스 빌드와 같은 설정) 또는 다른 버전 또는 다른 (버전의) 표준 라이브러리를 사용하여 이진 수준에서 상호 작용하는 부분을 작성할 때 부품이 C 이상의 API를 사용하여 서로 통신하는 경우 애플리케이션.

컨테이너 또는 예외와 같은 기능은 동일한 인터페이스를 제공하지만 이진 수준에서는 여러 가지 서로 호환되지 않는 방식으로 구현 될 수 있습니다.

그러나 다른 컴파일러를 사용하여 전체 코드를 컴파일하는 것은 다른 문제입니다. 고려해야 할 질문 :

  • 코드는 어떤 플랫폼 / 아키텍처를 대상으로합니까?
  • 어떤 표준을 위해 작성 되었습니까?
  • 비표준 컴파일러 기능을 사용합니까?
  • 코드에 하드 코딩 된 플랫폼 별 가정이 포함되어 있습니까 (항상 포인터가 2 바이트를 차지한다는 것을 고려할 때)?

또한 코드에 동작이 정의되지 않은 부분이 포함될 위험이 있습니다. 이것들은 하나의 컴파일러를 사용할 때 잘 작동하는 것처럼 보이지만 다른 컴파일러를 사용할 때 신비한 방법으로 실패합니다.


OP는 공급 업체가 아닌 코드를 작성하고 있습니다. OP는 빌드 환경 변경 (공급 업체 참조)이 동일한 코드베이스에서 코드 생성에 어떤 영향을 줄 수 있는지 묻고 있습니다.
Monica와의 가벼움 경주

1

구매 한 코드를 개발하는 데 사용한 것과 동일한 컴파일러 및 동일한 컴파일러 버전을 사용해야합니까?

컴파일러를 전환하면 문제가 발생할 수 있습니다. 현재 우리 회사에서는 Clang과 MSVC를 사용하며 한 컴파일러에는 다른 컴파일러가 표시하지 않는다는 오류가 있습니다.

구매 한 코드와 동일한 버전의 C ++를 사용해야합니까? 그것은 2014를 사용하지 않을 경우, 우리는 할 수 그것의 일부 기능을 사용하기를 원하지만 다른 버전을 혼합 몇 가지 문제가있을 수 있습니다하지 않는 경우.

반드시 필요한 것은 아니지만 컴파일러는 사용하려는 C ++ 버전을 지원해야합니다. C ++은 모든 버전에서 레트로 호환성을 보장합니다.


거의 내 생각입니다. 예를 들어 GCC 버전 x를 사용하고 최신 버전이 x + 2 인 경우 컴파일러 버전은 어떻습니까?
Mawg에 따르면 모니카 복원은

1
더 이상 사용하지 않으려는 컴파일러의 이전 버전을 사용하는 경우 문제가 없습니다. 더 이상 사용되지 않는 항목이 없기 때문에 최신 버전의 컴파일러를 사용하는 경우 문제가 발생할 수 있습니다.
LaboPie

그러나 어떻게? 나도 woudl을 선호하지 않습니다. 그러나 발생할 수있는 문제 유형에 대해 알고 있습니까?
Mawg에 따르면 모니카 복원은

그러나 발생할 수있는 문제 유형에 대해 알고 있습니까? 그들이 우리의 컴파일러가 지원하지 않는 함수를 사용하고 있다면, 코드는 단순히 컴파일되지 않을 것입니다.
LaboPie

1
약간의 부록은 물론 다른 사무실에서 사용하는 컴파일러가 큰 것이 아니라면 문제가 커집니다. EG 오래된 콘솔 컴파일러 또는 언어의 하위 집합에서 작동하는 것.
LaboPie

1

컴파일러를 변경할 때 한 가지 큰 문제는 정의되지 않은 동작입니다.받는 코드가 정의되지 않은 동작을 호출하면 코드를 올바르게 사용할 수 있고 컴파일러를 사용할 때 모든 테스트를 통과하고 컴파일러에 크게 잘못되는 것을 포함하여 모든 것이 가능합니다.

가능하지만 최적화 수준을 변경하고 동일한 버전의 다음 컴파일러 등을 사용하면 문제가 발생할 수도 있습니다. 따라서 피할 수있는 것은 없습니다.


이것은 lintvalgrind 사용에 대한 좋은 주장입니다 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.