2

3番目のパッケージからリンカーエラーを生成するC++としてコンパイルされたCコードの一部に問題があります。

セットアップは、lua、oolua、および2つを利用する私のプログラムがあります。このプロジェクトは、その恐ろしいビルドプロセスのためにluabindから移動されました。私のコードは、オブジェクトを作成するときに例外(予期される)をスローすることがありますが、ooluaはこのエラーを処理しません。

読んだところによると、C ++はこの問題を軽減し、プログラムを終了させるだけでなく、問題はooluaが何らかの理由でluaがC ++であることを好まないため、luaのコンパイルを行いました。

tl; dr:CコードがC ++としてコンパイルされている場合、正しくコンパイルされていると仮定すると、リンクでどのような問題が発生する可能性がありますか?

4

1 に答える 1

5

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関数にリンケージを使用します。マングリングが間違っており、シンボルの欠落について多くのリンカーエラーが発生します。

于 2012-12-04T03:34:38.940 に答える