質問
私はhpuxで何かを構築しています。コードはSun/Linux/AIXで正常に動作します。
しかし、hpuxでは、それは不平を言っています
[sshexec] /usr/ccs/bin/ld: Unsatisfied symbols:
[sshexec] globalVar (first referenced in blah.o)
もう一度コードはリリースで動作しますが、デバッグでは機能しません。それはすべて他のファイルで定義されたグローバル変数を使用します
extern globPck globalVar;
GlobPCKは、いくつかのグローバルなものを補うクラスです。
私は、これがリリースで機能する理由であるがデバッグではない理由であるアイデアにもっと興味を持っています。
.iファイル(-eで生成されたヘッダーファイルを事前縮小した)を調べましたが、同じ方法で定義されているようです。
リリースコードパスでヒットしたものが修正されていると推測していますが、Yallにいくつかのアイデアがあるかどうか聞いています。
解決
リンカーが何かが定義されていないと不平を言うときに最初にすることは、そのことを自分で見つけることです は 定義されています。見つけられない場合は、リンカーがそれを見つけることも期待しないでください。
あなたが示したのは、定義ではなく、宣言です。定義にはありません extern
キーワード。正確に1つに定義があるはずです .cpp ヘッダーではなく、プロジェクトにファイルします。
定義を見つけたら、リンカーがそれを見ない理由に取り組み始めることができます。多分それは特定の記号が存在するときにのみ定義されています、 DEBUG
また NDEBUG
.
定義がない場合、多分すべてです 使用します リリースコンピレーション中に削除されます(おそらく、すべての使用がで発生するため assert
コンパイラが省略しているステートメント)したがって、欠落している定義は、リリースモードでは気付かれません。
他のヒント
HPUXコンパイラは、クラスが実行のメインパスから間接的にのみアクセスされる場合、グローバルクラスへのコンストラクターコールを「最適化」することが大好きです。メインスレッドの変数の値を使用して、問題が明らかになっているかどうかを確認して、シンプルなprintf()を追加してみてください。