Вопрос

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

Это было полезно?

Решение

Некоторые комментарии в приведенных здесь ответах немного чересчур обобщенны.

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

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

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

Другие советы

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

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

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

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

Да, если вы сделаете это динамической ссылкой и оформите интерфейс в стиле 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 ++ продолжается позади, - это нормально, пока он содержится.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top