QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)
来源:互联网 发布:自动画线源码 编辑:程序博客网 时间:2024/04/28 06:25
http://my.oschina.net/jinzei/blog/130754
首先下载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"
1
#ifndef __FITZ_CPP_H__
2
#define __FITZ_CPP_H__
3
4
extern
"C"
5
{
6
#include "mupdf/fitz.h"
7
}
8
9
#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就是默认优化设置"优化为最快运行速度"
- QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)
- QT加载muPDF库和对muPDF的调用
- qt静态库编译加载资源的问题
- QT 加载静态库和动态库的方法
- Qt动态库和静态库的加载及使用
- QT Creator编译和使用QT的静态库
- qt 静态库的编译
- 编译QT的静态库
- VS2010使用静态编译的qt库
- Qt 静态库文件的生成使用!
- QT 加载mupdf 动态链接库,以及读取方法
- QT静态库和动态库的导出
- Qt静态库的下载和安装配置
- 编译Qt静态库
- Qt 静态库
- Qt静态库制作
- Window下Qt无法加载动静态库解决方案 - C/C++解惑之Qt Creator
- 【Qt】Qt动态库和静态库的创建和使用
- iPhoneSDK开发136技系列:第22技 使用粘贴板
- 单片机试验代码2
- POJ做题笔记之一 水题(1)
- 人类为什么喜欢游戏--因为现实是破碎的
- ArcGIS 10.0破解了,不能使用3D analyst和spatial analyst这两个工具,提示没有许可证
- QT加载muPDF静态库的问题和解决(导入C语言静态库,QT的运行时库设定)
- ARM+Linux开发板不能挂载U盘问题
- placement new 的问题
- Oracle存储过程和包管理
- sql
- Cxf - 基础和示例
- HDU1874
- 栈(数组形式)实现_c++
- Oracle声明变量