问题描述:
错误提示::-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