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

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

默认状况下没有v8引擎,v8版工程编不过,能够忽略. 确保mupdf.exe生成成功,能够测试一下效果.  c++

制做一个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" spa

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

muPDF的调用说明从这里穿越 code

相关文章
相关标签/搜索