Смешивание C / C ++ библиотек - PullRequest
       33

Смешивание C / C ++ библиотек

4 голосов
/ 04 сентября 2008

Возможно ли, чтобы gcc связывался с библиотекой, созданной в Visual C ++? Если так, есть ли какие-либо конфликты / проблемы, которые могут возникнуть из-за этого?

Ответы [ 5 ]

3 голосов
/ 04 сентября 2008

Некоторые комментарии в ответах здесь являются слишком обобщенными.

Хотя нет, в конкретном случае упомянутые двоичные файлы gcc не будут связаны с библиотекой VC ++ (AFAIK). Фактическое средство связывания кода / библиотек является вопросом используемого стандарта ABI.

Все более распространенным стандартом во встраиваемом мире является стандарт EABI (или ARM ABI) (основанный на работе, проделанной во время разработки Itanium http://www.codesourcery.com/cxx-abi/). Если компиляторы совместимы с EABI, они могут создавать исполняемые файлы и библиотеки, которые будут работать с каждым из них. др. Примером совместной работы нескольких наборов инструментов является компилятор RVCT ARM, который создает двоичные файлы, которые будут работать с двоичными файлами GCC ARM ABI.

(ссылка на исходный код в данный момент недоступна, но может быть кэширована в Google)

1 голос
/ 05 сентября 2008

Да, если вы сделаете динамическую ссылку и создадите интерфейс в стиле c. lib.exe создаст библиотеки импорта, совместимые с цепочкой инструментов gcc.

Это решит ваши проблемы со ссылками. Однако это только начало проблемы.

Большими проблемами будут такие вещи, как исключения и распределение памяти.

  • Вы должны убедиться, что исключения не переходят из кода VC ++ в код gcc, нет гарантий совместимости.
  • Каждый объект из библиотеки VC ++ должен жить в куче, потому что:
  • Не смешивайте gcc new / delete с чем-либо из VC ++, произойдут плохие вещи. Это относится и к построению объектов в стеке. Однако, если вы создадите интерфейс, такой как create_some_obj () / delete_some_obj (), вы не будете использовать gcc new для создания объектов VC ++. Может быть, сделать небольшой объект-обработчик, который обрабатывает строительство и разрушение. Таким образом вы сохраняете RAII, но все еще используете c-интерфейс для истинного интерфейса.
  • Соглашение о вызовах должно быть правильным. В VC ++ есть cdecl и stdcall. Если gcc попытается вызвать импортированную функцию с неправильным типом вызова, произойдут плохие вещи.

Суть в том, чтобы сохранить простой интерфейс, совместимый с ANSI C, и с вами все будет в порядке. Тот факт, что сумасшедший C ++ остается позади, это нормально, пока он содержится.

Да, и убедитесь, что весь код повторно вводится, иначе вы рискуете открыть еще один can-o-worms.

1 голос
/ 04 сентября 2008

Это невозможно. Обычно даже невозможно связать библиотеки, созданные разными версиями одного и того же компилятора.

1 голос
/ 04 сентября 2008

Нет. Просто и понятно: -)

1 голос
/ 04 сентября 2008

Я бы не догадался. Обычно компиляторы c ++ имеют совершенно разные методы обработки имен, что означает, что компоновщикам не удастся найти правильные символы. Кстати, это хорошо, потому что по стандарту компиляторы C ++ допускают гораздо большую степень несовместимости, чем просто эта, что приведет к сбою, смерти, поеданию щенков и смазыванию краски по всей стене.

Обычные схемы, чтобы обойти это, обычно включают в себя независимые от языка методы, такие как COM или CORBA. Более простой освященный метод - использовать C-оболочки вокруг вашего кода C ++.

...