qt添加so库时出现不可兼容错误

来源:互联网 发布:济南程序员工资 编辑:程序博客网 时间:2024/05/01 19:11

问题描述:

错误提示::-1: 错误:skipping incompatible /usr/local/lib/libzzm.so when searching for -lzzm

.pro文件如下:

#-------------------------------------------------

#

# Project created by QtCreator 2013-08-27T17:47:32

#

#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ImageProcess

TEMPLATE = app

SOURCES += main.cpp\

        mainwindow.cpp \

    bmpimage.cpp \

    imagewidget.cpp \

    imageprocess.cpp \

    DecodeImagePrepare.cpp

HEADERS  += mainwindow.h \

    bmpimage.h \

    imagewidget.h \

    imageprocess.h \

    DecodeImagePrepare.h \

    /usr/local/lib ZDecode.h

FORMS    += mainwindow.ui

LIBS += -L/usr/local/lib -lzzm

并且在用的地方添加了头文件。

 

分析问题:

开始认为是 LIBS += -L/usr/local/lib -lzzm 语句存在问题,结果无论怎么修改该语句都存在问题。修改过的形式如下:

LIBS += -L/usr/local/lib -l   zzm

LIBS += -L  /usr/local/lib  -lzzm

修改libzzm.so放置的位置,并将该.so文件放置到了相应的目录下:

LIBS += -L ./ -lzzm              当前可执行文件的目录

LIBS += -L/usr/lib -lzzm

开始怀疑是不是别人提供的.so文件存在问题。

 

后来我自己写了个方法,实现如下:

hello.c

#include<stdio.h>

int hello()

{

    printf("hello world!\n");

    int a = 5, b = 3;

     return a + b;

}

产生.so文件,命令如下:

查看得到的.so文件:

将.so文件拷贝到可执行文件所在的目录下:

调用的main.c文件如下:


#include <QApplication>
#include <QImage>
#include <complex>
#include <QPainter>
#include <QWidget>
#include <QtGui/QLabel>
#include <QPushButton>
#include <QLibrary>

extern "C"
{int hello();}

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    int sum = 0;
    sum = hello();

    return a.exec();
}

 

工程的.pro文件内容如下

#-------------------------------------------------
#
# Project created by QtCreator 2013-08-27T17:47:32
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ImageProcess
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp \
    bmpimage.cpp \
    imagewidget.cpp \
    imageprocess.cpp \
    DecodeImagePrepare.cpp

HEADERS  += mainwindow.h \
    bmpimage.h \
    imagewidget.h \
    imageprocess.h \
    DecodeImagePrepare.h \
    ZDecode.h

FORMS    += mainwindow.ui

LIBS += -L ./ -lhello

 

编译后,链接成功!

运行结果:


 

扩展:

方法二,在程序中加载动态库

    QLibrary pZcodeLib("/width/app/ImageProcess/libhello.so");
    bool isload = pZcodeLib.load();
    if(!isload)
    {
        return 0;
    }

    int ret = 0;
    typedef int (*Fun)();
    Fun decode = (Fun)pZcodeLib.resolve("hello");
    if (decode)
    {
        // 解码
        ret = decode();
    }

 

参考文章:

1、http://blog.csdn.net/binghehjbenben/article/details/7693714

2、http://www.cnblogs.com/qyddbear/archive/2012/09/12/2682119.html