2015-09-11 4 views
3

Предположим, у меня есть библиотека, скомпилированная с компилятором A. Она выделяет память с помощью malloc() и оставляет ее мне до free(). Он не предоставляет специальной бесплатной функции.Совместимость free/malloc между компиляторами

Могу ли я скомпилировать мою программу (которая использует эту библиотеку) с компилятором B? Или мне нужно беспокоиться о том, что один компилятор (стандартная библиотека) malloc несовместим с другим free?

В дополнении к общему вопросу, который я также хотел бы знать ответ специально для этих компиляторов: система лязг на OS X с НКОЙ MacPorts' 4,9 или 5.

+0

Вообще говоря, библиотека, скомпилированная с компилятором A, * не * совместима с компилятором B. Даже если компиляция завершается успешно, нет гарантии, что сгенерированная программа будет работать правильно. При этом clang действительно стремится к совместимости с gcc, поэтому он может работать *, однако это поведение полностью зависит от компилятора и должно быть проверено специально в вашем случае. – UnholySheep

+5

@UnholySheep Ваш комментарий неверен практически для всех, кроме Windows. Для обеспечения совместимости есть нечто, называемое ABI. Это немного более нечеткое в Windows, где разные поставщики компиляторов имеют/имеют разные соглашения о вызовах, но в UNIX-подобных операционных системах для каждой операционной системы всегда существовал один ABI, поэтому библиотеки, созданные одним компилятором, могут взаимодействовать с библиотеками, скомпилированными другим один. Конечно, вы можете целенаправленно сломать это, если попытаетесь очень тяжело, но он работает во всех случаях, кроме таких случаев. – fuz

+0

Clang и GCC играют отлично на MacOSX. В обоих случаях 'malloc' и' free' предоставляются libc.dylib - который поставляется с операционной системой, а не с компилятором. Если вы компилируете C++, вы можете даже смешивать и сопоставлять libC++ и CLU clang libstdC++ вместе в одном и том же исполняемом файле. Также имейте в виду, что если вы установили опцию командной строки Xcode, вызов gcc из командной строки фактически даст вам «clang», и подавляющее большинство времени это не проблема. – marko

ответ

5

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

Ваш вопрос указывает на путаницу между компиляторами и библиотеками. Компиляция библиотеки с компилятором A не означает, что она использует функцию malloc библиотеки A. Библиотеки указываются во время этапа ссылки, а не при компиляции библиотеки. Когда вы создаете исполняемую программу, вы связываете основную программу с библиотекой, которую вы скомпилировали, и библиотекой времени выполнения C. malloc и free предоставляются в библиотеке времени выполнения C, и в результате будет только один из них.

+0

Я не знаю, к чему относится спецификация ABI. Могу ли я предположить, что все, что есть в стандартной библиотеке C (включая 'free' и' malloc'), будет совместимо? Я был обеспокоен тем, что многие библиотеки предоставляют для этого свои собственные бесплатные функции (но некоторые из них этого не делают). – Szabolcs

+0

Можем ли мы предположить, что две реализации 'malloc' совместимы? Я бы не подумал. Мое понимание вопроса заключается в том, что он не спрашивает об ABI или API, а о внутренней реализации. Например, 'malloc' из libarary A может быть реализован с фиксированными блоками, в то время как' malloc' для библиотеки B может иметь блоки с переменным размером (простой пример). Поэтому вы не можете называть 'malloc' из одной библиотеки и' free' с другой. – kaylum

+0

Когда вы связываетесь с библиотекой, вы получаете все ее функции. Поэтому, если вы используете библиотеку A 'malloc', вы также используете ее' free', и они будут работать вместе. – Barmar

0

free и malloc не всегда совместимы между компиляторами. В частности, they are not compatible between MSVC and MinGW.

я столкнулся со следующей ситуацией:

Я использовал библиотеку C, которая имеет функцию, которая возвращает массив. Массив должен быть free d пользователем, когда он больше не нужен. Я использовал предварительно скомпилированную DLL этой библиотеки, используя MSVC. Однако DLL была скомпилирована с помощью MinGW. Использование MSVC free в памяти, выделенной MinGW malloc, приводит к сбою. Но обеспечение того, что free/malloc всегда используется в совместимых парах, избегало проблем, даже если моя программа использовала другой компилятор C, чем DLL.

Смежные вопросы