問題描述:
錯誤提示::-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