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 
4extern "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就是默认优化设置"优化为最快运行速度"


0 0