2013-02-09 87 views
4

我想從MATLAB工具包'oscmex'執行一些示例代碼。該工具包允許在MATLAB上使用OSC協議進行通信。我認爲這個問題是非特定的;它應該適用於任何工具包,它是以這種方式設置的。將MATLAB鏈接到一個DLL庫

拋開原因,我有一些簡單的麻煩讓工具包啓動並運行。該工具包沒有任何文檔。只有一組六個DLL文件(在一個目錄中)以及一組四個MATLAB'.m'示例代碼文件(在另一個目錄中)。過去我使用的每個工具包都是內置工具包,或者有直觀的(半自動)安裝程序。

下載工具包之後,我嘗試的第一件事就是運行其中一個'.M'示例代碼。這失敗了,因爲代碼的第一行包含功能osc(),它目前還沒有被MATLAB識別。

所以,我想我可能需要將'.M'文件移動到與DLL相同的文件夾中;也許MATLAB會看到DLL內部的函數。沒有骰子。

所以,我意識到我必須在啓動時以某種方式將MATLAB鏈接到DLL。我嘗試將DLL添加到一個文件夾,並在'pathdef.m'文件中添加一個條目。這也失敗了。

我讀過某處我可以通過使用loadlibrary()函數加載DLL文件。所以,我試圖做這個DLL文件。這在第一個文件上失敗:

>> loadlibrary('osc_free_address.dll') 

Error using loadlibrary>lFullPath (line 587) 
Could not find file osc_free_address.h. 

我開始用盡選項......我怎樣才能讓這組DLL運行起來?

+0

看起來它正在尋找dll的頭文件。你通常熟悉'mex'文件和共享庫之間的區別嗎?如果沒有,我會熟悉如何從matlab中調用本地代碼:http://www.mathworks。COM /幫助/ MATLAB/matlab_external /引入-MEX-files.html; http://www.mathworks.com/help/matlab/matlab_external/calling-functions-in-shared-libraries.html。此外,請確保您在使用的代碼中爲正確的架構編譯了dll。 – 2013-02-11 17:30:05

+0

不幸的是,工具箱包裏沒有頭文件。該工具包可以在這裏找到:http://sourceforge.net/projects/oscmex – CaptainProg 2013-02-11 17:32:40

回答

1

瀏覽此庫的web page看起來這些DLL只是舊格式mex文件。
因此,他們應該在共享庫的上下文中使用而不是(例如,使用loadlibrarycalllib),而是直接編譯爲mex文件。

要做到這一點,我建議以下步驟:

  1. 請確保您有配置爲您的MATLAB工作MEX編譯器。
    在MATLAB中,鍵入:

    >> mex -setup 
    

    這將引導您完成整個配置過程。我知道你正在開發一個Windows機器,我通常使用Visual Studio編譯器 - 對我來說最合適。

  2. 這圖書館的README文件顯示,OSC

    需要liblo 0.22或更高版本。見http://plugin.org.uk/liblo/

    確保你有這樣的庫,它位於你LD_LIBRARY_PATH(見例如,this question瞭解詳細信息,或mex docs)。

  3. 獲取來源來自their repository的OSC庫的代碼。

  4. 使用

    >> mex -O -largeArrayDims osc_free_address.c 
    >> mex -O -largeArrayDims osc_free_server.c 
    

    等所有7 C源文件編譯MATLAB中的源。在mex-c文件之後,您將擁有可以從Matlab運行的mex文件,就好像它們是常規函數一樣。
    正如Andrew Mao所建議的那樣,您可能會發現使用library's make file很有用。

祝你好運,

+0

loadlibrary應該工作。 mex也會起作用,但不是問題的答案。 – Ono 2014-06-11 16:13:11

+0

@Ono - 什麼?你可以說得更詳細點嗎? – Shai 2014-06-12 05:38:48

1

如果您查看該軟件的版本,它正在編譯mex文件,而不是DLL(共享庫):http://sourceforge.net/p/oscmex/code/4/tree/trunk/src/osc_make.m

我會嘗試使用mex命令而不是dll命令(也許這些文件只是名稱錯誤)。甚至更好的是,我將使用源代碼中的構建文件使用mex自己編譯這些文件。

請注意,說明還說,您需要liblo-0.22才能運行庫,因此請確保您具有可訪問性。

-1

共享庫不能直接使用。正如你所提到的,你需要使用loadlibrary將它們加載到MATLAB中。根據文檔,loadlibrary需要兩個參數(至少)。第一個參數是文件的名稱,第二個參數是包含函數和外部變量定義的頭文件。如果你沒有提供頭文件,MATLAB將查找與DLL名稱相同的文件。話雖如此,您需要訪問頭文件或者至少如果您知道該函數的外觀如何,您需要爲該DLL編寫一個頭文件。

我在MATLAB中使用過DLL。只要考慮DLL,MATLAB不是非常用戶友好的。特別是,如果DLL是用C(或C++)以外的語言編寫的,那麼在將函數加載到MATLAB中時會遇到問題。

此外,MATLAB只能支持一些特定的DLL。基於您的MATLAB版本,您需要了解MATLAB是否支持共享庫。看看Here

簡而言之,向DLL加載DLL並不容易。您需要從DLL獲得一些信息。

0

我看了一下你的OSC Toolkit。看來他們已經被MATLAB mex編譯了。但是,沒有提到他們建造了哪種建築。您可以在MATLAB命令提示符處輸入mexext來查找您的MATLAB mex文件的擴展名。然後,將DLL擴展更改爲給定的擴展。如果原始mex與您的matlab兼容,則可以通過MATLAB輕鬆訪問該DLL。只要確保將文件夾添加到您的MATLAB路徑。

0

嘗試從.dll文件更改擴展到.mexw32(在Win32),或.wexw64(Win64中中)。這是一個長鏡頭,但它可能工作。