文档章节

QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)

龍禳
 龍禳
发布于 2013/05/14 11:37
字数 688
阅读 1995
收藏 2

首先下载muPDF,找到mupdf-1.2-source.zip下载解压. 进入win32目录,打开mupdf工程(vs2008及以上会提示转换,转换后自动产生.sln工程)

默认情况下没有v8引擎,v8版工程编不过,可以忽略. 确保mupdf.exe生成成功,可以测试一下效果. 

制作一个QT动态库dll实现一些功能,包含头文件fitz.h 导入库libmupdf.lib .一切完事后编译发现所有使用到的函数都报LNK2001: unresolved external symbol 链接错误:未解析的外部符号.

原因和解决办法如下:

因为mupdf使用纯C代码,编译产生的lib具有浓厚的C色彩,作为lib导出的函数修饰符仅仅只有前缀_. 如fz_new_context函数的导出为_fz_new_context.而我们用c++代码加载时,修饰后找的函数却是?fz_new_context@@YAPAUfz_context_s@@PAUfz_alloc_context_s@@PAUfz_locks_context_s@@I @Z自然找不到. 

让mupdf库修改他的导出自然是不可能了,只能在导入的时候做特别声明. 找到fitz.h 由于里面的函数太多,我们只找相关的函数(就是报无法解析的外部符号的函数)在前面加extern "C"让他按C方式修饰再找,就能找到了. 为了保持原代码的完整性,可以复制fitz.h到fitz_cpp.h,在新文件中修改,自己的代码只包含"fitz_cpp.h"

#ifndef __FITZ_CPP_H__
#define __FITZ_CPP_H__

extern "C"
{
#include "mupdf/fitz.h"
}

#endif

再次编译提示
LIBCMT.lib(dosmap.obj) : error LNK2005: __errno 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(tidtable.obj) : error LNK2005: __encoded_null 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(crtheap.obj) : error LNK2005: __malloc_crt 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(mlock.obj) : error LNK2005: __unlock 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(mlock.obj) : error LNK2005: __lock 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(winxfltr.obj) : error LNK2005: ___CppXcptFilter 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit 已经在 MSVCRT.lib(MSVCR100.dll) 中定义
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z 已经在 MSVCRT.lib(cinitexe.obj) 中定义
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z 已经在 MSVCRT.lib(cinitexe.obj) 中定义
库冲突了.mupdf的lib使用MT运行库,而QT和VS都默认使用MD运行库. 那么QT怎么改为使用MT运行库呢
QMAKE_CXXFLAGS_RELEASE = -O2 -MT -GL
QMAKE_CXXFLAGS_DEBUG = -Zi -MTd
以上在Pro文件中添加. 相关含义可以参考VS的工程设置. 除了MT外 尽量保持原有默认设置.例如上面的-O2就是默认优化设置"优化为最快运行速度"

muPDF的调用说明从这里穿越

© 著作权归作者所有

共有 人打赏支持
龍禳
粉丝 2
博文 13
码字总数 14283
作品 0
深圳
程序员
私信 提问
iOS MUPDF集成及开发(干货!)

MUPDF的集成 网上一搜一大把的MUPDF集成教程,大致步骤如下: 1.git上下载代码 2.运行 mupdf -> platform -> ios 文件夹下就可以运行官网的demo Build目录下会生成对应各种架构的静态库 4.将...

睿少
03/14
0
0
基于MuPDF和Qt的PDF阅读器的开发

基于MuPDF和Qt的PDF阅读器的开发 一、引言 设备上要渲染显示PDF文档,类似Adobe Reader、福昕阅读器等软件。如何去实现?Handling PDF这篇文档讨论介绍了在Qt应用程序中各种操作PDF的资料。从...

容我三思兮
07/17
0
0
mupdf将pdf文件中的某页导出成图片

下面是编译一下mupdf的例子,由于他使用的是win系统,所以以下是在win上的vs2008的编译步骤。 下载地址:www.mupdf.com 我下载的版本是:mupdf-1.3-source.tar.gz 目录构成: 解压缩以后发现...

moki_oschina
2015/11/05
0
0
关于mupdf在android2.1及以下版本的无法运行问题

mupdf在android2.1及以下版本会存在运行问题,跟踪分析之后得出是因为 so库中应用了libjnigraphics.so,而这个文件在android 2.2之后才有的.请教下这个应该如何解决.thanks...

ZHL
2012/10/25
487
1
Palm被控侵犯GPL许可协议

因Palm Pre智能手机中的PDF浏览器违反了GPL许可证,Palm遭Artifex Software的起诉。 Artifex指控Palm拷贝了Artifex的PDF渲染引擎muPDF,整合到Palm Pre的PDF浏览程序中,但没有使用正确的许可...

红薯
2009/12/07
303
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
25
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
31
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
35
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
48
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部