Могу ли я связать объект, скомпилированный clang c ++ 11, с другим, скомпилированным с c ++ 17 - PullRequest
0 голосов
/ 01 ноября 2018

Я специально ищу ответ лягушки на этот вопрос . Если я скомпилирую один объект с -std=c++11, а другой с -std=c++17, могут ли они быть безопасно связаны?

1 Ответ

0 голосов
/ 02 ноября 2018

Ответ, отправленный здесь Джонатаном Уэйкли, верен и для Clang.

Простой ответ : если вы компилируете оба объекта самостоятельно, выбранный вами вариант -std не повлияет на конечный результат.

Большая часть заданного C ++ ABI определяется стандартной библиотекой. Остальная часть - это поддержка различных сред выполнения, таких как исключения, встроенные компиляторы (которые могут фактически отправляться в стандартную библиотеку) и тому подобное. libstdc++ Совместимость с ABI - явная цель для Clang, так что все в порядке.

Если вы используете ту же версию компилятора, опция -std изменит то, какие символы открываются для кода при компиляции. Однако ABI-библиотека libstdc ++ для стабильных функций совместима с предыдущими версиями, поэтому с вами тоже все будет в порядке.

Трудный ответ : Ваши комментарии предполагают, что у вас есть источник, но если у вас есть только объектные файлы и вы просто делаете последнюю ссылку, есть большая вероятность, что она будет работать, если только версия Clang не использовалась для сборки std=c++11 объект очень старый. Авторы g++ и libstdc++ старались изо всех сил использовать символы версий, поэтому шансы на то, что у вас есть что-то, связывающее, но затем не поддающееся трудному диагностированию, в основном равны нулю. (Об этом говорится в последнем абзаце в ответе Джонатана).

Опять же, поскольку Clang стремится поддерживать совместимость с ABI libstdc++, с вами все будет в порядке. Есть и другие детали, но подавляющее большинство адресовано в ответе Джонатана, и он в лучшем положении, чтобы объяснить это, чем я.

...