システム: i32 チップセットで 32 ビットの Ubuntu 12.04 を実行しています。
ビルド情報: Qt 4.8.1 と GCC で C++ 11 を使用しています。
問題: 社内で開発されたライブラリに依存するプロジェクトを開発しています。これ以降はslugと呼ばれます。これらのライブラリは、従来の「cmake」を介して .so ファイルに組み込まれています。次に、「すべてを作成」プロセス。.so ファイルが cmake から生成された後、.so ファイルをプロジェクトのサブディレクトリにコピーして、/usr/lib にインストールする前にそれらが機能することをテストできるようにします。次に、Qt (.pro ファイル内) に各ライブラリへの絶対パスを指定し、アプリケーションをビルドします。私のアプリケーションは、これらのローカル ライブラリを見つけて、エラーや警告なしでコンパイルします。ただし、(コマンド ライン経由で) アプリケーションを実行すると、次のエラーが表示されます。
error while loading shared libraries: libslugSpec.so: wrong ELF class: ELFCLASS64
ただし、64 ビット環境でスラッグ ライブラリをビルドし、64 ビット環境でそれらにリンクすると、アプリケーションは完全に実行されます。そのため、64 ビット環境用の .so ファイルをビルドし、ライブラリのビルドに使用される CMakeLists.txt ファイルの編集に進みました。cuda (スラッグが依存している) ビットネス フラグに加えて、32 ビットのコンパイルおよびリンク フラグ、共有オブジェクト モジュール フラグを多数追加します。試したフラグの組み合わせに関係なく、生成されたライブラリは、アプリケーションの実行可能ファイルを実行するときにエラーを引き起こし続けました。そこで、各共有オブジェクト ファイルに対してreadelf -hコマンドを実行し、それらが本当に 64 ビットかどうかを確認することにしました。実際にはどれも、次のようなログを生成していることがわかりました: (3 つの .so ファイルの 1 つの出力)
readelf -h libslugSpec.so
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: DYN (Shared object file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x10150
Start of program headers: 52 (bytes into file)
Start of section headers: 511960 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 7
Size of section headers: 40 (bytes)
Number of section headers: 38
Section header string table index: 35
だから今、私は完全に途方に暮れており、どこにも答えが見つからないようです。これがどのように起こっているのかを明らかにすることは、大きな助けになるでしょう.
参考までに、アプリケーションをビルドする qt .pro ファイルで提供しているフラグを次に示します。
QMAKE_CXXFLAGS += "-std=gnu++0x"
QT += core gui opengl
TARGET = source
TEMPLATE = app
CONFIG+= wwwidgets
#linux specific settings
unix:!macx{
LIBS += -lGLEW -lGLU /home/alex/Dropbox/brain-viz/source/lib/libslugUtil.so /home/alex/Dropbox/brain-viz/source/lib/libslugSpec.so /home/alex/Dropbox/brain-viz/source/lib/libslugSim.so
}
#windows specific settings
win32{
LIBS += -lglew32 -lwwwidgets4d
}