C ++ библиотека, ссылающаяся на C ++ dll с использованием g ++ - PullRequest
2 голосов
/ 20 февраля 2011

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

Это моя строка g ++:

g++ -L C:/MyLibraries mycode.cpp -shared -o mycode.dll -lopengl32 -lglu32 -lgdi32 -lMyLibrary

Каждый ответ, с которым я сталкивался до сих пор, говорит о том, что мой заголовок обернут следующим образом:

#ifdef __cplusplus
extern "C" {
#endif
...
#ifdef __cplusplus
}
#endif

Тем не менее, моя библиотека на чистом C ++, 100% классы, нет глобальных функций, ничего, что extern "C" может нарушить (не может extern "C" для методов в классах, и упаковывает весь набор классов с extern "C" ничего не делает ... все еще неопределенные ссылки при связывании).

MyLibrary.lib был написан в Visual Studio 2010. И я написал много библиотек, используя Visual Studio 2005 и 2008. Ни одному из них никогда не требовалось добавлять extern «C» для любой из них, чтобы статически связать их с другой Visual Studio. основанные проекты. Библиотеки C ++, связанные с другим проектом C ++, без проблем, когда-либо.

Это то, что Visual Studio заботится о том, что g ++ не делает? Я могу статически связать большое количество моих собственных статических библиотек C ++ вместе с другими проектами C ++, и это просто работает. Является ли Visual Studio достаточно умным, чтобы расшифровывать искажение имен собственных методов C ++, поэтому я никогда не сталкивался с этим до сих пор? Но g ++ не знает, что делать, заставляя требовать соглашения об именах C (хотя я на 100% C ++ со всех сторон)?

Или проблема в том, что, хотя я использую g ++, он все еще применяет некоторые стандартные правила C? Что-то не так с моей командной строкой g ++?

Даже поиск ответа в MSDN по экспорту функций DLL делает его более похожим на то, что у меня просто что-то не так с моей строкой g ++, потому что их ссылки имеют такие темы, как «Экспорт функций C в исполняемые файлы C ++» и «Экспорт C ++». «Функции в исполняемые файлы C», где нигде не упоминается ссылка «Экспорт функций C ++ в исполняемые файлы C ++» ... Я попробовал __declspec (dllexport) для своих функций, которые компилировались, но до сих пор не определено связывание с g ++. Есть идеи?

Спасибо.

1 Ответ

7 голосов
/ 20 февраля 2011

Visual Studio и g ++ используют совершенно разные соглашения для таких вещей, как искажение имен, разметка vtable и т. Д., Так что небезопасно связывать библиотеки, созданные с ними вместе (кроме случаев, когда они обмениваются данными только через интерфейсы C). Более подробную информацию можно получить по адресу http://www.mingw.org/wiki/MixingCompilers на сайте MinGW.

...