2

プロジェクトを Xcode から Linux に移行しようとしています (現時点では Ubuntu x86 ですが、静的にリンクされた実行可能ファイルが x86 CentOS マシンで実行されることを願っています)。プロジェクト全体をコンパイルしましたが、リンク段階で失敗しました。IPP で定義されたすべての関数に対して未定義の参照が与えられています。これはおそらく本当に小さくてばかげたものですが、私はこれについて数日間頭を悩ませてきましたが、動作させることができません.

コンパイル ステートメントは次のとおりです (同じエラーを生成するメイクファイルもあります)。

g++ -static /opt/intel/ipp/6.0.1.071/ia32/lib/libippiemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippimerged.a /opt/intel/ipp/6.0.1.071/ ia32/lib/libippsemerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippsmerged.a /opt/intel/ipp/6.0.1.071/ia32/lib/libippcore.a -pthread -I /opt/ intel/ipp/6.0.1.071/ia32/include -I tools/include -o main main.cpp pick_peak.cpp get_starting_segments.cpp get_segment_timing_differences.cpp recast_and_normalize_wave_file.cpp rhythm_score.cpp pitch_score.cpp pitch_curve.cpp tools/source/LocalBuffer.cpp tools/source/wave.cpp distance.cpp

...そして、ここにリンカーエラーの長いリストの最初があります:

./main.o: In function `main':
main.cpp:(.text+0x13f): undefined reference to `ippsMalloc_16s'
main.cpp:(.text+0x166): undefined reference to `ippsMalloc_32f'
main.cpp:(.text+0x213): undefined reference to `ippsMalloc_16s'

何か案は?FWIW、これらは問題なくビルド、リンク、および実行される私の Xcode プロジェクトの IPP 依存関係です:

ありがとう!

4

2 に答える 2

1

コードをippのv6にリンクする際に問題が発生しました。コンパイラのv11バージョン(ippへのアップデートが含まれている)を使用すると、不思議なことにそれらが修正されました。確かに、それはWindowsプラットフォームの場合でしたが、ドキュメントに有効と記載されているにもかかわらず、8uバージョンの関数をコンパイルし、32fバージョンは取得していませんでした。

于 2009-02-03T19:17:57.637 に答える
1

リンクの問題は、リンク ラインが完全に逆向きになっていることが原因である可能性があります。順序が重要な理由を理解するには、これをお読みください。

また、Linux では、静的にリンクされた実行可能ファイルは、動的にリンクされた実行可能ファイルよりも移植性が大幅に低下することに注意してください。一般に、古い Linux システムでシステム ライブラリを動的にリンクすると、すべての新しいシステムで動作します (古い RedHat 6.2 を使用していますが、実行可能ファイルが実行されないシステムは見たことがありません)。これは、完全に静的な実行可能ファイルには当てはまりません。リンク先の libc とは異なる libc を持つシステムに移動すると、あらゆる種類の「興味深い」方法でクラッシュする可能性があります。

于 2009-02-07T05:22:51.233 に答える