Смешивание библиотек C / C ++
-
09-06-2019 - |
Вопрос
Возможно ли, чтобы 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 ++ продолжается позади, - это нормально, пока он содержится.
Да, и убедитесь, что весь код повторно введен, иначе вы рискуете открыть еще одну консервную банку с червями.