系统:我在 i32 芯片组上运行 32 位 Ubuntu 12.04。
构建信息:我正在使用带有 Qt 4.8.1 和 GCC 的 C++ 11。
问题:我正在开发一个项目,该项目依赖于下文提到的内部开发库,称为slug。这些库通过传统的“cmake”内置到 .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 文件。除了 cuda(slug 依赖的)位标志之外,我还添加了许多 32 位编译和链接标志、共享对象模块标志。无论我尝试了何种标志组合,生成的库在运行我的应用程序可执行文件时都会导致错误。所以我决定对每个共享对象文件运行readelf -h命令并检查它们是否真的是 64 位的。我发现它们实际上都不是,都产生类似于以下内容的日志:(3个.so文件之一的输出)
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
}