Компиляция C как ошибка компоновщика C ++ (lua и oolua)

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

У меня есть настройки lua, oolua и моя программа, в которой они используются. Этот проект был перенесен из luabind из-за его ужасного процесса сборки. Мой код иногда вызывает исключение (что ожидается) при создании объекта, и oolua не обрабатывает эту ошибку.

Из чтения, которое я сделал, компиляция lua как C ++ должна облегчить эту проблему и заставить программу не просто выйти, но проблема в том, что oolua почему-то не нравится, когда lua является C ++, и я не могу найти ссылки на то, почему это может быть.

tl; dr: Если код C скомпилирован как C ++, какие проблемы могут возникнуть с компоновкой, если он компилируется правильно?

1

Решение

Когда Lua компилируется как C ++, он фактически использует искажение имен C ++, а обычные заголовки должны использоваться C ++. Не смущайтесь lua.hpp заголовок. Это должно использоваться только для C ++, когда Lua компилируется как C. В результате, когда вы компилируете Lua как C ++, вы должны не использование extern "C", К сожалению, OOLua использует extern "C" Вот. Вы можете попробовать изменить заголовок в OOLua, чтобы не использовать extern "C" а затем перекомпилируйте OOLua или отправьте им сообщение об ошибке, чтобы исправить это.

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

Длинное объяснение:

Когда Lua компилируется как C, нет внешних операторов, и поэтому все функции получают значение по умолчанию (extern "C"). Когда C-файлы используют Lua, они используют обычные заголовочные файлы, которые также не содержат внешних выражений, поэтому компилятор предполагает, что все должно быть extern "C" и все это соответствует библиотеке. Если вы используете Lua из C ++, вы используете lua.hpp который содержит extern "C" блок, так что ваш компилятор знает, что Lua extern "C",

Когда Lua компилируется как C ++, нет внешних операторов, поэтому компилятор предполагает, что все функции в Lua extern "C++", Вы больше не можете использовать Lua непосредственно из C. Если вы используете Lua из C ++ с lua.hpp тогда он видит extern "C" блок, предполагает, что функции Lua extern "C" и терпит неудачу во время соединения из-за неправильного искажения. Если вы используете обычные заголовки непосредственно из C ++, тогда нет внешних операторов, поэтому extern "C++" предполагается. Это соответствует библиотеке, и все в порядке.

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]