3

リンクしようとしているライブラリが3つあります(それ以上ですが、この説明に必要なものはすべてあります)。「ルート」ライブラリはc++であり、依存関係として2番目のライブラリがあり、これもc++です。3番目のライブラリはcであり、2番目のライブラリに依存しています。

このプロジェクトをリンクすると、2番目のライブラリ(c ++)から呼び出されている3番目のライブラリ(cにある)のすべてのメソッドへの未定義の参照が表示されます。3番目のライブラリには、このタイプの使用に必要なように、ヘッダーが「extern"C"」で適切に囲まれています。

これをトラブルシューティングしようとしたときに、静的としてビルドされていることをライブラリに通知するためのマクロが適切に設定されていないことがわかりました。それを修正して、すべてのcスタイル関数の前に配置されていた別のマクロを変更したことがわかりました。エクスポートから代わりに「extern"C"」と言います。要約すると、c ++ライブラリのcスタイルのメソッドは、別のマクロを修正した後、それらの前に「extern"C"」を付けて宣言されていました。これを行うと、「ルート」ライブラリから2番目のライブラリで呼び出していたすべてのcスタイルのメソッドが、未定義の参照を取得し始めました。

他のライブラリがこれを行っているのを見たことがないので、これは奇妙だと思ったので、マクロが「extern "C"」と定義された行の部分を、空白のままにして賞賛しました。これを行うと、2番目のライブラリのc-styleメソッドへの未定義の参照がなくなり、3番目のライブラリのメソッドへの未定義の参照が返されました。

私はこれを自分で調べてみましたが、ほとんどすべての結果が「「外部の「C」を括弧で囲んでください!」ですが、これはすでにここに当てはまります。また、リンカーの順序の問題である可能性があると考え、検証しました。リンカーに行くコマンドで設定されたリンカーの順序が適切であるため、これを引き起こしている原因がわかりません。名前を混乱させるようなもののようですが、これがどのように起こっているのかを一生見つけることができません。またはそれを修正する方法。

私の質問:一体何が起こっているのですか?これを解決するために、他にどのような方法を検討できますか?

私はWindowsXP32ビットを使用しており、MinGWでコンパイルしています。コードを見たい場合...これは大きなプロジェクト用なので少し複雑ですが、ルートライブラリは私が取り組んでいるゲームエンジンであり、2番目のライブラリはcAudioで、3番目のライブラリはOpenALソフトです。 これがリポジトリのルートディレクトリ、これがcAudioのベースディレクトリ、そしてこれが私たちが使用しているOpenALsoftのベースディレクトリです。

長い間お詫び申し上げます。これまでにご利用いただいた皆様、ありがとうございました!

4

1 に答える 1

0

私はなんとか問題の原因を見つけることができました。短いバージョンは、CMakeが正しく構成されていなかったことです。

長いバージョンでは、ライブラリを静的としてビルドしようとしたときに、CMakeを介して手動で定義が追加されていました(これはここに当てはまります)。OpenALだけでなく、cAudio用にも1つあります。OpenALがコンパイルされたとき、CMakeスクリプトのその部分で提供されている定義を適切に使用していました。これらの定義は、階層内の他のプロジェクトと共有されませんでした。そのため、cAudioをコンパイルするときに、エクスポートマクロが空白に解決されず、代わりに「dllimport」に設定されるように解決されました。cAudioがリンクに移動したとき、「_ imp」というプレフィックスが付いたシンボルが必要でしたが、コンパイルされたライブラリには当てはまりませんでした。したがって、私が取得していた未定義の参照が発生します。

これを解決するには、cAudio CMakeに適切な定義を追加して、cAudioがOpenALインクルードでコンパイルされているときにインポートマクロが正しく解決されるようにしました。

于 2013-03-27T04:49:42.817 に答える