Проблема со связыванием различных объектных файлов обычно сводится к соглашениям о вызовах подпрограмм.По сути, когда вы делаете вызов подпрограммы, расположенной в другом объектном файле, ваш компилятор должен знать, как этот другой объектный файл назовет свою подпрограмму внутренне, как передать все его параметры и какой (если таковой имеется) код настройки и очисткирутина потребует.Все эти вещи обычно группируются под заголовком соглашение о вызовах s.
Каждый компилятор имеет свои собственные соглашения о вызовах, которые он любит использовать для подпрограмм.Заметьте, я сказал «компилятор», а не язык.Соглашение о вызовах C в Linux отличается от соглашения о вызовах C в Windows.
Поэтому, когда вы смешиваете языки, вам нужно каким-то образом указать компилятору для вызывающей или вызываемой подпрограммы использовать вызов другого языкаусловность.Соглашение C является популярным и используется как своего рода «лингва франка», поскольку почти на каждой платформе есть компилятор C.Однако некоторые платформы (например, Windows) имеют несколько популярных соглашений о вызовах.
Итак, теперь мы задаем вопрос, который вы задали в комментариях:
Существует ли распространенный способ "сообщитькомпилятор использует соглашение о вызовах другого языка "?
И ответ" Нет, не совсем ".В некоторых языках есть определенные способы использования определенных соглашений о вызовах для других языков.Например, C ++ позволяет вам помещать extern "C"
в объявления, чтобы сообщить компилятору, что рассматриваемое объявление (я) использует соглашение о вызовах C.Ада выполняет то же самое с pragma Convention (X,...)
, где X - это условное название.C
, Fortran
и Cobol
определяются языком, но все, что поддерживается (например: Windows 'Stdcall
), определяется реализацией.
Однако, если у вас есть пара языковчьи авторы компиляторов никогда не думали друг о друге, тогда у вас нет другого выбора, кроме как сказать обоим использовать какое-то третье соглашение, о котором они оба знают (обычно Си).Например, чтобы обеспечить взаимодействие standard C ++ и Ada, серверный код должен экспортировать свои подпрограммы с использованием соглашения C и сообщить клиентскому коду, что вызываемые им подпрограммы используют соглашение C.