Использование различных компиляторов C ++ и языковых версий при разработке одного исполняемого файла


15

Наша компания приобретет большой и очень сложный фрагмент исходного кода для спутниковой связи.

Он написан на C ++, и мы будем кодировать дополнения к нему, также на C ++, связывая наш код с приобретенным кодом в единый исполняемый модуль.

  • Необходимо ли использовать тот же компилятор и ту же версию компилятора, которая использовалась для разработки приобретенного кода?

  • Нужно ли использовать ту же версию C ++, что и купленный код? Если он не использует 2014, мы можем использовать некоторые его функции, но не в том случае, если могут возникнуть проблемы со смешиванием разных версий.

В теории, конечно, это не должно иметь значения, особенно языковая версия, но возможно, что разные версии компилятора будут генерировать разные объектные коды, что может привести к разнице во времени и т. Д.

Что мы должны знать?


7
Я надеюсь, что вы покупаете не только исходный код, но и некоторую поддержку (квалифицированными специалистами) по нему.
Старынкевич,

1
Действительно, мы есть. И, конечно, я тоже задал этот вопрос поставщику. Но я подумал, что это будет хорошим предметом для обсуждения и хорошим будущим ориентиром для других в будущем.
Мауг говорит восстановить Монику

2
Вы говорите о компиляции стороннего кода с использованием неподдерживаемого компилятора, или вы говорите о компиляции разных частей кода с использованием разных компиляторов (например, использование поддерживаемого кода для приобретаемого вами кода и более нового для вашего собственного кода, а затем связывать их)? Или это решение между этими частями вопроса?
jpmc26

3
Даже языковая версия может иметь значение, см. Gcc.gnu.org/wiki/Cxx11AbiCompatibility для получения списка (более старых) версий компилятора и небольших различий в ABI. Другими словами: один и тот же компилятор, но могут быть разные настройки языка c ++ (c ++ 03 s c ++ 11).
Андре

2
А с MSVC, как правило, небезопасно передавать объекты стандартной библиотеки через (динамические) границы библиотеки. Смотрите, например, stackoverflow.com/q/5661738/417197
Андре

Ответы:


9

Необходимо ли использовать тот же компилятор и ту же версию компилятора, которая использовалась для разработки приобретенного кода?

По-разному.

Компиляторы генерируют код, ориентированный на ABI. Некоторые используют общий ABI (например, если я не ошибаюсь, и clang ++, и g ++ ориентированы на Itanium ABI), и вы должны - могут быть ошибки, мешающие вам сделать это - возможность использовать объектный код от обоих в одной программе (при условии, конечно, что вы используете версии, которые предназначены для одной и той же версии ABI). То же самое верно для версии компилятора: некоторые обращают больше внимания на то, чтобы сохранить одинаковый ABI между версиями, чем другие. Очевидно, что все они когда-нибудь нуждаются в изменении ABI, и они могут быть вынуждены сделать это несовместимым способом. И очевидно, что некоторые параметры, такие как выбор языкового стандарта, могут влиять на выбор ABI.

Тогда есть проблема стандартной библиотеки. Компиляторы (или разные версии одного и того же компилятора) могут использовать один и тот же ABI, но их стандартная библиотека может быть несовместима (и некоторые компиляторы, такие как clang ++, могут использоваться с несколькими стандартными библиотеками). Возможность заставить его работать, может зависеть от того, что используется в интерфейсе.

Другими словами, вы должны копать и находить информацию для конкретного случая, в котором вы находитесь. В качестве отправной точки и примера того, какую информацию вы должны искать, вот информация, предоставляемая libstdc ++ (библиотека, используемая g ++ и в какой-то конфигурации clang ++)


10
ABI = двоичный интерфейс приложения
Simon B

2
Этот ответ о совместимости объектного кода. ОП покупает исходный код .
Легкость гонки с Моникой

7
@LightnessRacesinOrbit Вопрос говорит об использовании разных компиляторов для генерации одного исполняемого файла. Это не большой скачок, чтобы думать: «Они подразумевают компиляцию стороннего кода с одним компилятором (возможно,« поддерживаемым ») и их собственный код с другим компилятором (возможно, более новым)». (Это, безусловно, то, что, как я понимаю, ОП спрашивает; если вы читаете его по-другому, вы можете попросить ОП пояснить.) В этой или других аналогичных случаях совместимость объектного кода представляется весьма актуальной.
jpmc26

1
@ jpmc26: «Это определенно то, о чем я понимаю, что ОП спрашивает; если вы читаете это по-другому, вы можете попросить ОП пояснить». ОП четко заявил, что их компания «купит большой и очень сложный кусок исходного кода». Кроме того, с помощью таких утверждений, как «возможно, что разные версии компилятора будут генерировать разные объектные коды, что может привести к разнице во времени», они задаются вопросом о том, какие изменения происходят при компиляции купленного кода с разными наборами инструментов, а не только с их собственными. Я не думаю, что есть много места для интерпретации там!
Легкость гонки с Моникой

8

Необходимо ли использовать тот же компилятор и ту же версию компилятора, которая использовалась для разработки приобретенного кода? Нужно ли использовать ту же версию C ++, что и купленный код?

Это не в основном технический вопрос. Это юридический вопрос о том, что вы пишете в своем контракте. Убедитесь, что поставщик программного обеспечения предоставляет вам гарантированную им версию для использования в вашей среде. В противном случае всегда будет определенный риск возникновения проблем с другим компилятором, версией компилятора или языковой версией.

Это особенно важно при покупке компонента или его частей в виде закрытого источника. Даже если ваш поставщик гарантирует, что вы можете использовать компонент с текущей средой компилятора, он гарантирует, что предоставит вам обновления, если вы хотите переключиться на более новую версию компилятора в будущем? Если у вас нет доступа к полному исходному коду, вам, вероятно, не повезет, если вы попытаетесь самостоятельно решить какие-либо проблемы с совместимостью. Вот почему вы должны не только купить программное обеспечение, но и подумать о заключении долгосрочного контракта на техническое обслуживание с вашим поставщиком.


На самом деле это очень хороший совет!
Т. Сар - Восстановить Монику

Это действительно так, но, увы, уже поздно. Как я заметил в комментарии Базиле, я тоже задал этот вопрос поставщику. Но я подумал, что это будет хорошим
предметом

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 Ammon - Восстановить Монику

1
@CortAmmon: Вы должны / должны скомпилировать все компоненты получившегося дистрибутива с помощью цепочек инструментов, которые имеют общий интерфейс ABI. Стандарты ABI выходят за рамки C ++. Я не думаю, что ОП спрашивает о смешивании наборов инструментов в любом случае.
Легкость гонки с Моникой

2

Вы не связываете код, вы связываете скомпилированные объектные файлы.

В этом случае да, использование разных компиляторов C ++ (или даже таких настроек, как сборки отладки / выпуска), или их разных версий, или разных (версий) стандартных библиотек при создании частей, которые будут взаимодействовать на двоичном уровне, с большой вероятностью может привести к поломке приложение, если части взаимодействуют друг с другом, используя более C API.

Такие функции, как контейнеры или исключения, обеспечивают один и тот же интерфейс, но на двоичном уровне могут быть реализованы многими различными несовместимыми способами.

Однако использование другого компилятора для компиляции всего кода является другой проблемой. Вопросы для рассмотрения:

  • На какую платформу / архитектуру нацелен код?
  • Для какого стандарта это было написано?
  • Использует ли он какие-либо нестандартные функции компилятора?
  • Содержит ли код жестко запрограммированные специфические для платформы допущения (например, всегда учитывая, что указатели занимают 2 байта)?

Существует также риск того, что код может содержать части, которые приводят к неопределенному поведению. Может показаться, что они работают нормально при использовании одного компилятора, но загадочным образом не работают при использовании другого.


ОП строит код, а не поставщик. OP спрашивает, как изменение среды сборки (см. Производителя) может повлиять на генерацию кода с учетом той же кодовой базы.
Легкость гонки с Моникой

1

Необходимо ли использовать тот же компилятор и ту же версию компилятора, которая использовалась для разработки приобретенного кода?

Что ж, переключение компилятора может привести к некоторым проблемам; в настоящее время в моей компании мы используем Clang и MSVC, и у нас есть ошибка в одном компиляторе, который другой не помечает как таковой.

Нужно ли использовать ту же версию C ++, что и купленный код? Если он не использует 2014 год, возможно , мы захотим использовать некоторые его функции, но не в том случае, если могут возникнуть проблемы со смешиванием разных версий.

Это не обязательно, но, конечно, ваш компилятор должен поддерживать версию C ++, которую вы хотите использовать. C ++ гарантирует ретро-совместимость начиная со всех версий.


В значительной степени мое мышление. Как насчет версий компилятора - если они используют версию GCC x, а последняя, ​​например, x + 2?
Мауг говорит восстановить Монику

1
Хорошо, если они используют более старую версию компилятора, который вы хотите использовать, проблем нет, потому что не существует такой вещи, как устаревшие, проблема может возникнуть, если они используют более новую версию вашего компилятора.
LaboPie

Но как? Я тоже предпочитаю этого не делать. Но знаете ли вы о каких-либо проблем, которые могут возникнуть?
Моуг говорит восстановить Монику

Но знаете ли вы о каких-либо проблем, которые могут возникнуть? Если они использовали какую-то функцию, которую наш компилятор не будет поддерживать, код просто не будет компилироваться.
LaboPie

1
Небольшое приложение, конечно, проблема становится больше, если компилятор из другого офиса не был основным. Например, старый консольный компилятор или что-то, что работает с подмножеством языка.
LaboPie

1

Одна большая проблема при изменении компиляторов - неопределенное поведение: если код, который вы получаете, вызывает неопределенное поведение, то все возможно - включая то, что код работает просто отлично и проходит все свои тесты при использовании их компилятора, и ужасно неправильно работает с вашим компилятором.

Это возможно, но в этой ситуации вы также можете столкнуться с проблемами, если вы измените уровни оптимизации, используете следующую версию того же компилятора и так далее. Так что ничего нельзя избежать.


Это хороший аргумент в пользу использования lint и, возможно, valgrind .
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.