У меня возникли проблемы с частью кода C, который скомпилирован как C ++, производящий ошибку компоновщика из третьего пакета.
У меня есть настройки lua, oolua и моя программа, в которой они используются. Этот проект был перенесен из luabind из-за его ужасного процесса сборки. Мой код иногда вызывает исключение (что ожидается) при создании объекта, и oolua не обрабатывает эту ошибку.
Из чтения, которое я сделал, компиляция lua как C ++ должна облегчить эту проблему и заставить программу не просто выйти, но проблема в том, что oolua почему-то не нравится, когда lua является C ++, и я не могу найти ссылки на то, почему это может быть.
tl; dr: Если код C скомпилирован как C ++, какие проблемы могут возникнуть с компоновкой, если он компилируется правильно?
Когда 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 ++, искажение является неправильным, и вы получаете много ошибок компоновщика о пропущенных символах.
Других решений пока нет …