LuaがC++としてコンパイルされる場合、実際にはC ++の名前マングリングが使用され、通常のヘッダーはC++で使用される必要があります。lua.hpp
ヘッダーと混同しないでください。これは、LuaがCとしてコンパイルされる場合にのみC ++に使用する必要があります。その結果、LuaをC ++としてコンパイルする場合は、を使用しないextern "C"
でください。残念ながら、OOLuaはextern "C"
ここで使用します。OOLuaのヘッダーを使用しないように変更してから、OOLuaをextern "C"
再コンパイルするか、バグを報告して適切に修正することができます。
残念ながら、C ++でLuaを使用する際の落とし穴に気付いている人はあまりいないようです。そのため、多くのプロジェクトでは、Luaが通常どおりCとしてコンパイルされていると想定しています。
長い説明:
LuaがCとしてコンパイルされる場合、externステートメントがないため、すべての関数がデフォルト(extern "C"
)を取得します。CファイルがLuaを使用する場合、それらは通常のヘッダーファイルを使用しますが、これもexternステートメントを含まないため、コンパイラーはすべてがライブラリーであるextern "C"
と想定し、すべてがライブラリーと一致します。C ++からLuaを使用する場合lua.hpp
は、ブロックを含むLuaを使用するextern "C"
ため、コンパイラーはLuaが。であることを認識しますextern "C"
。
LuaがC++としてコンパイルされる場合、externステートメントがないため、コンパイラーはLuaのすべての関数がであると想定しますextern "C++"
。Cから直接Luaを使用することはできなくなりました。C++からLuaを使用すると、ブロックが表示され、間違ったマングリングのためにリンク時にLua関数が失敗しlua.hpp
たと見なされます。C ++から直接通常のヘッダーを使用する場合は、externステートメントがないため、想定されます。これはライブラリと一致し、すべてOKです。extern "C"
extern "C"
extern "C++"
OOLuaが行うことは、通常のヘッダーが含まれていますが、そのextern "C"
周りに独自のヘッダーがあるため、コンパイラーextern "C"
は、実際にC ++リンケージを使用しているときに、すべてのLua関数にリンケージを使用します。マングリングが間違っており、シンボルの欠落について多くのリンカーエラーが発生します。