基於開源PDFium,編譯動態庫--Windows平臺(下)

 

開篇注:博客是爲了更好的思考,但願能以此記錄本身的學習歷程。本文寫於2018年09月11日,修改於2018年09月12日。隨着時間流逝,可能有些內容已經失效,望讀者望文觀義,get到關鍵點。假如對文中有啥有疑問、有想法、感受不太對的地方歡迎留言交流~。windows

引言

基於谷歌開源代碼修改,編譯PDFium動態庫–Windows平臺(上)文章中我留下個坑,用上篇文章的方法編譯出來windows平臺32位的庫,導出函數名是非C風格的。那加載動態庫後解析函數不就game over了麼,這篇來補個坑。ide

先觀察

首先,先看看x86平臺的庫導出函數名啥形式,dumpbin -exports pdfium.dll:
圖1 x86平臺庫導出函數名
而後想一想是哪裏出問題了,應該就是導出函數名那裏的宏判斷沒有向預想的那樣走下去。函數

查官方文檔

出問題了先看看官方文檔吧,這一查。。。官方在https://www.chromium.org/developers/gn-build-configuration這裏這麼說:學習

Overriding the CPU architecture
By default, the GN build will match that of the host OS and CPU architecture. To override:
target_cpu = 「x86」
Possible values for the target_cpu:
Windows supports 「x86」 and 「x64」. Since building is only supported on 64-bit machines, the default will always be 「x64」.
Mac and desktop Linux supports only 「x64」. On desktop Linux you might also theoretically try any of the ARM or MIPS architecture strings form the Android section below, but these aren’t supported or tested and you will also need a sysroot.
Chrome OS supports 「x86」 and 「x64」, but to build a 32-bit binary you will need to use a sysroot on a 64-bit machine.
If you specify an Android build (see below) the default CPU architecture will be 「arm」. You could try overriding it to 「arm64」, 「x86」, 「mipsel」, or 「mips64el」 but the GN builds for these aren’t regularly tested.ui

額,這麼看來好像官方對x86支持不是很好。spa

改代碼

接下來,就考慮下改代碼吧。編譯生成pdfium.dll,pdfium\public文件夾下的fpdfview.h控制最外層,那就從如下代碼入手.net

#ifdef FPDFSDK_EXPORTS # if defined(_WIN32) # define FPDF_EXPORT __declspec(dllexport) # define FPDF_CALLCONV __stdcall # else # define FPDF_EXPORT __attribute__((visibility("default"))) # define FPDF_CALLCONV # endif #else # if defined(_WIN32) # define FPDF_EXPORT __declspec(dllimport) # define FPDF_CALLCONV __stdcall # else # define FPDF_EXPORT # define FPDF_CALLCONV # endif #endif

改爲以下形式:code

#if defined(FPDFSDK_EXPORTS) #ifdef _WIN32 #define FPDF_EXPORT __declspec(dllexport)
#else
#define FPDF_EXPORT __attribute__ ((visibility("default")))
#endif
#else #ifdef _WIN32 #define FPDF_EXPORT __declspec(dllimport)
#else
#define FPDF_EXPORT __attribute__ ((visibility("default")))
#endif
#endif
#define FPDF_CALLCONV

而後這時候從新gn構建,ninja執行構建,編出來的x86平臺動態庫就正常了。orm

相關文章
相關標籤/搜索