C++ 在32位环境中链接到32位共享对象文件会生成ELFCLASS64错误

C++ 在32位环境中链接到32位共享对象文件会生成ELFCLASS64错误,c++,linux,qt,linker,intel,C++,Linux,Qt,Linker,Intel,系统:我正在i32芯片组上运行32位Ubuntu 12.04 < >强>构建信息< /强>:我使用C++ 11,带有Qt4.8-1和gcc.< /p> 问题:我正在开发一个项目,该项目依赖于内部开发的库(下文称为slug)。这些库通过传统的“cmake”然后“makeall”过程内置到.so文件中。从cmake生成.so文件后,我将.so文件复制到项目的子目录中,以便在将它们安装到/usr/lib之前测试它们是否正常工作。然后我为Qt(在我的.pro文件中)提供每个库的绝对路径,并构建我的应用程

系统:我正在i32芯片组上运行32位Ubuntu 12.04

< >强>构建信息< /强>:我使用C++ 11,带有Qt4.8-1和gcc.< /p> 问题:我正在开发一个项目,该项目依赖于内部开发的库(下文称为slug)。这些库通过传统的“cmake”然后“makeall”过程内置到.so文件中。从cmake生成.so文件后,我将.so文件复制到项目的子目录中,以便在将它们安装到/usr/lib之前测试它们是否正常工作。然后我为Qt(在我的.pro文件中)提供每个库的绝对路径,并构建我的应用程序。我的应用程序找到这些本地库并编译,没有错误或警告。但是,当我运行应用程序(通过命令行)时,我收到以下错误:

    error while loading shared libraries: libslugSpec.so: wrong ELF class: ELFCLASS64
然而,当我在64位环境中构建slug库并在64位环境中链接到它们时,我的应用程序运行得非常好。因此,我想我为64位环境构建了.So文件,并继续编辑用于构建库的CMakeLists.txt文件。我添加了许多32位编译和链接标志、共享对象模块标志,以及cuda(slug所依赖的)位标志。无论我尝试了什么标志组合,生成的库都会在运行应用程序可执行文件时不断导致错误。所以我决定对每个共享对象文件运行readelf-h命令,检查它们是否真的是64位的。我发现它们中没有一个实际上都在生成类似于以下内容的日志:(3.so文件之一的输出)

所以现在我完全不知所措,似乎在任何地方都找不到答案。任何关于这将如何发生的解释都将是一个巨大的帮助

以下是我在构建应用程序的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
    }
此错误消息:

加载共享库时出错:libslugSpec.so:错误的ELF类:ELFCLASS64

与此输出不一致:

结论:加载的
libslugSpec.so
版本与运行的
readelf-h
版本不同

通过执行以下操作,找出运行时加载了哪个
libslugSpec.so

LD_DEBUG=files,libs /path/to/your/executable
然后在该库上运行
readelf-h
,并确认它实际上是
ELF64


最后,将其替换为您构建的版本(或设置
LD\u LIBRARY\u PATH
在“系统”一号之前获取您的版本),问题将得到解决。

您完全正确!我必须在/usr/lib中安装了以前版本的libSlugSpec副本。非常感谢你!
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
LD_DEBUG=files,libs /path/to/your/executable