文档章节

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

龍禳
 龍禳
发布于 2013/05/14 11:37
字数 688
阅读 1919
收藏 2
点赞 0
评论 0

首先下载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
深圳
程序员
如何打包发布基于Qt4 Windows的软件

先从Windows平台开始。 Windows平台下的软件发布最主要的需求是想办法找到在你的发布中应该包含哪些必须的文件, 同时要保证应用程序运行时能正确找到这些文件, 发布基于Qt的软件也是同样的...

barsoom ⋅ 2012/11/28 ⋅ 0

QML程序的发布

最近用C++和QML写了一个音乐播放器Clean Player,前前后后遇到不少问题,好在现在基本解决了,现在先总结下QML程序的发布。 QML文件加载可用绝对路径和相对路径,建议将.qml文件加载到资源文件...

dios51 ⋅ 2014/06/18 ⋅ 0

QtInternal 之 Plugin

注意:本文翻译自 http://developer.qt.nokia.com 中的BasicsOfPlugins 与QtPlugin ,中文译文见 插件基础 与 插件 ,如果你对翻译wiki感兴趣,请参考Wiki中文帮助 注:QtInternal 系列是用来...

晨曦之光 ⋅ 2012/05/08 ⋅ 0

QtInternal 之 Resources

注意:本文翻译自 http://developer.qt.nokia.com 中的 Resources ,中文译文见 简体中文版 ,如果你对翻译wiki感兴趣,请参考Wiki中文帮助 概述 资源是将包括图像、声音等任意二进制数据作为...

晨曦之光 ⋅ 2012/05/08 ⋅ 0

Qt之打包发布(NSIS详解)

发布方式 Qt发布的时候,通常使用两种方式: 1、利用向导制作安装包:

china008 ⋅ 2014/05/12 ⋅ 0

VS2010使用静态编译的qt库

Qt开发界面很方便,但发布程序就不那么方便了,你的把引用到的dll一起发布才行,要是能静态编译就好了,发布的时候只有一个exe多方便。 虽然以前为了方便,直接安装的qt-windows-opensource...

shelman_Lee ⋅ 2015/08/07 ⋅ 0

PostgreSQL用户创建删除及error while loading shared lib...

1.为数据库创建一个pgtestuser用户; [root@kevin lib]# su - postgres[postgres@kevin ~]$ createuser pg_test_usercreateuser: error while loading shared libraries: libpq.so.5: cannot ......

Socrates Duan ⋅ 2011/07/15 ⋅ 0

Qt Embedded性能优化详解

Qt Embedded是挪威公司的图形化界面开发工具QT的嵌入式版本,它通过QTAPI与LinuxI/O以及Framebuffer直接交互,拥有较高的运行效率,而且整体采用面向对象编程,拥有良好地体系架构和编程模式....

水海云 ⋅ 2013/04/14 ⋅ 0

在Qt中如何编写插件,加载插件和卸载插件

转:http://blog.csdn.net/dfman1978/article/details/5135831 Qt提供了一个类QPluginLoader来加载静态库和动态库,在Qt中,Qt把动态库和静态库都看成是一个插件,使用QPluginLoader来加载和...

长平狐 ⋅ 2013/01/11 ⋅ 0

c++调用python脚本遇到的那些坑

问题一:一开始我是在qt上编写程序的,qt是32bit,但Python是64bit,在*.pro文件中配置了: INCLUDEPATH += C:/Python27/include/ LIBS += C:/Python27/libs/python27_d.lib 还是报错,究极原...

jr_lu ⋅ 2017/01/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

UI ,前端框架选型

Flat-UI

miaojiangmin ⋅ 5分钟前 ⋅ 0

Istio Service Mesh 教程

Istio Service Mesh 教程 作者 宋净超 | 5400字 | 阅读大约需要11分钟 | 归档于istio | 发表于 2018-05-22 标签 #Istio #教程,来自 https://servicemesher.github.io/blog/istio-service-m...

openthings ⋅ 10分钟前 ⋅ 0

scala swing

scala swing组件的库 https://github.com/scala/scala-swing scala swing的API文档 https://www.scala-lang.org/api/2.9.1/scala/swing/package.html...

whoisliang ⋅ 15分钟前 ⋅ 0

CentOS安装配置Nginx

安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-deve......

临江仙卜算子 ⋅ 21分钟前 ⋅ 0

开源 java CMS - FreeCMS2.8 依申请公开

项目地址:http://www.freeteam.cn/ 依申请公开 1. 转交申请公开 用户可以把申请公开转交给其他人办理,系统会记录此申请公开的转交记录。 注意:同时只能转交一个申请公开。 选择需要转交的...

freeteam ⋅ 25分钟前 ⋅ 0

以太坊 web3.py 签名转账

以太坊 web3.py 签名转账 本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86...

netkiller- ⋅ 31分钟前 ⋅ 0

年薪40W的程序员必会的技术有哪些?

很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? 下面是我的一个总结...

码代码的小司机 ⋅ 31分钟前 ⋅ 0

jesque-spring使用及源码分析

1.使用 jesque结合spring使用,步骤如下: 1.1 在项目中添加maven依赖 <dependency> <groupId>net.lariverosc</groupId> <artifactId>jesque-spring</artifactId> <version>1.0.0</ve......

Funcy1122 ⋅ 33分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 59分钟前 ⋅ 16

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部