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

相關文章
相關標籤/搜索