1. 程式人生 > >vs2015使用MinGW編譯的動態庫

vs2015使用MinGW編譯的動態庫

工作過程中經常會遇到使用其他開源專案的情況,有些開源專案有vs工程,比如opus,可以直接編譯出vs可識別的動態庫或靜態庫,但有些開源專案則沒有,此時想要做的就是利用該原始碼編譯一個或多個庫來使用。

MinGw完全可以勝任這些工作,它可以安裝autoconf、automake等工具,用來編碼原始碼很方便,折騰半天庫終於編譯出來了,MinGW下測試也木有問題,但是vs不識別,不識別,不識別。。。

嘗試過很多辦法,vs總是這種任性,就是不識別。

工作還是需要進行的,庫也沒法丟,一來沒有那能力寫出大神級的程式碼,二來專案也沒時間讓你搞這種高大上的東東。

那麼怎麼辦呢!突然想到Android原始碼中經常會用到dlopen這個函式,它的功能就是與硬體廠商協商好介面,然後通過該函式開啟硬體廠商的庫,從而完成底層工作,但這也導致了,Android屬於半開源專案,怪不得被Linux被辭掉。

經過多次嘗試,總結出一條:雖然vs連結器無法識別這個庫,但編譯器識別!!!

假設我們有庫libtest.dll,庫中有函式void test_fun();

示例程式碼如下:

#include <Windows.h>

int main()
{
    HMODULE libHandle = LoadLibrary("libtest.dll");

    void *pFunc = GetProcAddress(libHandle, "test_fun");

    void (*funp)() = (void (*)())fFunc;

    funp();

    return 0;
}

編譯執行,完美通過,funp也能得到我們想要的結果。

但唯一美中不足的是,LoadLibrary好像只能從動態庫中提取C函式,c++中的類好像沒戲,也有可能是個人功力不到,不得門徑。

所以我這裡採取的辦法是,當遇到C++程式碼時,使用C程式碼將其封裝一層。畢竟C和C++是可以完美互調的。

通過這種方式還有一個意料之外的好處,庫可以隨意換,對使用者而言,沒有任何影響,可以完美的當做外掛使用。