2012-04-01 20 views
-1

シンボルはファイル内にあります。 nm & grepを使って検証しましたが、コンパイルされたアプリケーションを実行すると未定義のシンボルエラーが表示されます。共有ライブラリの他のシンボルも正常に動作しています。ヘッダーファイルはexternとして宣言し、条件付きプリプロセッサブロックには存在しません。私はc/C++を初めて使っているので、このようなことを体験していただければ幸いです。g ++未定義シンボル共有ライブラリを使用しているエラー

StackOverflowには数多くの関連する質問がありますが、誰もが質問の実際のコンテキストを意味するものではないソースファイルとヘッダーをリストしています。これは一般的なプログラミングの質問です:なぜg ++はコンパイルされたアプリケーションにシンボルをリンクできませんか?ヘッダー定義が正常にチェックされ、シンボルが共有ライブラリにあり、他のシンボルが適切に動作していることを確認します。

+3

例がないと、あなたを助けるのが難しいです。 g ++を呼び出すときに-lLIB_NAME引数を使用していますか? – mfontanini

+2

あなたの質問に 'nm'から関連する出力行を追加してください。 –

+3

シンボルが_runtime_に見つからない場合は、g ++とは関係ありません。アプリケーションが実際にリンクしようとしている共有ライブラリを見つけるには 'ldd'を使います。それはあなたが期待している場所ですか? – Troubadour

答えて

0

LD_LIBRARY_PATH環境変数を、ライブラリの開発バージョンへのパスを含めるように設定する必要があります。これにより、アプリケーションを実行するときにランタイムリンカー(ld.so)がそれを見つけることが保証されます。

ビルドの設定は問題ありませんが、実行時の動作には影響しません。本当にしたい場合は、ビルド時に実行可能ファイルにパスを "焼く"方法があります。ライブラリの検索方法については、ld.soのマニュアルページを参照してください。

+1

これは最終的に何をしようとしているかによって異なります。/usr/libにあるライブラリを置き換える場合は、開発中に一時的にLD_LIBRARY_PATHを設定するだけで済みます。/usr/libバージョンを保持し、常にアプリケーションが/ usr/local/libバージョンを使用するようにするには、スクリプトを使用してアプリケーションを起動することを検討して、LD_LIBRARY_PATHを自動的に設定できるようにすることができます必要)。 – Troubadour

+0

私は私のプロジェクトのための解決策を思いついた。私がやったことは、アプリケーションとともに出荷されるライブラリに完全に改名されたことです。これは、ターゲット・ライブラリー名がmakeファイルで便利に定義されているため、簡単でした。参照:[My MDN Wiki Entry](詳細はhttps://developer.mozilla.org/En/SpiderMonkey/Build_Documentation/Rebranding_SpiderMonkey_%281.8.5%29) –

+0

問題を追跡するのを手伝ってくれてありがとう! –

関連する問題