Как подключить программу на C к библиотеке C ++ без необходимости использования stdc ++ для их связывания? - PullRequest
2 голосов
/ 26 января 2012

Я пытаюсь добавить некоторый код в более крупный проект C, который требует использования библиотеки C ++.

Библиотека C ++ предоставляет оболочку с использованием функций, помеченных как extern "C", которые обеспечивают доступ к функциональности библиотеки

//Some C++ library
//mywrapper.h
#ifdef __cplusplus
extern "C" {
#endif

void wrapperFunction1( int width );
void wrapperFunction1( int height);
#ifdef __cplusplus
} // extern "C"
#endif

Компилируется с g ++ без проблем.

При создании программы на C и включении mywrapper.h я постоянно получаю ошибки компоновщика, ссылающиеся на vtable и cxa_pure_virtual:

undefined reference to `vtable for __cxxabiv1::__class_type_info'
undefined reference to `__cxa_pure_virtual'

При тестировании эти ошибки исчезают и позволяют программе компилироваться, когда я добавляю библиотеку stdc ++, но это не вариант для более крупного проекта C. Есть ли способ скомпилировать программу C для доступа к библиотеке C ++ без этих ошибок и без stdc ++? И дело об ошибках относится к модулям, которые находятся глубоко внутри библиотеки C ++ и на которые нет ссылок в mywrapper.h, так почему же программа C даже пытается ссылаться на них?

Ответы [ 5 ]

8 голосов
/ 26 января 2012

Библиотека C ++ зависит от стандартной библиотеки C ++ (libstdc ++, опция -lstdc++ для компоновщика, по умолчанию, если вы запускаете компоновщик через g++). Это факт. С этим ничего не поделаешь. Преодолей это.

Оболочка заголовок относится не к этим символам, а к фактическим объектным файлам в библиотеке do . Поэтому их нужно определить, и способ их определения - включить стандартную библиотеку C ++.

Обратите внимание: если динамическая библиотека сама по себе является динамической, она будет знать, что она зависит, и вам не нужно будет динамически указывать ссылки на libstdc ++.

3 голосов
/ 26 января 2012

Обёрнутая библиотека C ++ требует stdc ++, а не обертку.

Вы обернули функции C ++ так, что они могут вызываться из C, но они все еще используют библиотеку внутри, которая зависит от стандартной библиотеки C ++. Если вы не предоставляете stdc ++, в используемой вами библиотеке отсутствует часть ее реализации. Если вы не переписываете библиотеку C ++, это никак не обойдется.

1 голос
/ 19 июля 2012

Вполне допустимо не включать libstdc++ с некоторыми оговорками. В зависимости от того, что вы делаете в коде C ++ (или в данном случае в библиотеке, которую вы упаковываете), он может ожидать, что базовая среда выполнения предоставит определенные функции:

  • Как вы упомянули, RTTI info
  • __cxa_pure_virtual если у вас есть нереализованные чисто виртуальные функции (например, в чисто абстрактных классах)
  • Вызывает конструкторы до main() и деструкторы после нее

Это происходит не только тогда, когда вы не включаете библиотеку libstdc++, но и в урезанных пользовательских версиях библиотеки.

Например, Rowley Crossworks for ARM (набор инструментов для встроенных систем) рекомендует самостоятельно написать обработчик ошибок __cxa_pure_virtual.

1 голос
/ 26 января 2012

Как правило, код C ++ требует некоторого уровня поддержки времени выполнения для работы с конкретными функциями C ++.Например, есть библиотечная функция, имеющая дело с dynamic_cast<>().Даже если вы не используете какую-либо стандартную библиотеку C ++, вам понадобится эта языковая поддержка libray.Обычно она включена в стандартную библиотеку C ++, но специально для gcc эта библиотека доступна отдельно.То есть, вы можете обойтись без включения libstdc++, но вам не обойдется без этой библиотеки.Сейчас я не могу понять, как это называется.Я думаю, что это -lcxxabi, но я не уверен.

0 голосов
/ 28 января 2012

Хорошо, я провел еще какое-то исследование и наткнулся на ответ. У меня были две проблемы, во-первых, были сообщения об ошибках:

./lib.so: undefined reference to vtable for __cxxabiv1::__si_class_type_info' 
./lib.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'

Они связаны с информацией о типе C ++ во время выполнения,или RTT.Компиляция библиотеки с "-fno-rtti" устранила эти ошибки.

Вторая проблема была:

./lib.so: undefined reference to __cxa_pure_virtual'

, которая была вызвана невозможностью компилятора C обрабатывать виртуальную функцию из C ++.Создание функции-заглушки с extern "C" устранило ошибку и позволило компилировать проект.

Я все еще подтверждаю, работает ли библиотека правильно, но эти изменения, похоже, исправили ошибки.

Спасибо за помощь всем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...