0

システム: 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
    }
4

1 に答える 1

2

このエラーメッセージ:

共有ライブラリのロード中にエラーが発生しました:libslugSpec.so:間違ったELFクラス:ELFCLASS64

この出力と一致していません:

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

結論:実行したバージョンとは異なるバージョンをロードしlibslugSpec.soますreadelf -h

これを実行して、実行時にロードされるものを 見つけます。libslugSpec.so

LD_DEBUG=files,libs /path/to/your/executable

次に、そのライブラリで実行readelf -hし、それが実際にあることを確認します。ELF64

LD_LIBRARY_PATH最後に、作成したバージョン(または「システム」バージョンの前にバージョンを取得するように設定したバージョン)に置き換えれば、問題は解決します。

于 2013-02-24T22:55:49.253 に答える