harris對於dlm的官方說明其實不管是示例的testmodule還是另一篇部落格裡面都有好些不需要的,我做了很大的精簡。乙個第三方的dlm,用於參考學習
另乙個講dlm的csdn部落格,但個人覺得太複雜了
安裝路徑下該資料夾中所有檔案:
/idl/external/dlm/*
安裝路徑下該依賴項標頭檔案:
/idl/external/include/idl_export.h
首先要把idl_export.h
加進去。
#include
#include
"idl_export.h"
然後是定義自己在idl中呼叫的過程或者函式,我定義的是passfn的過程,將字串引數列印在螢幕上。
static
void
passfn
(int argc, idl_vptr ar**)
定義過程的格式是(假如你的過程名為pro1)
static
void
pro1
(int argc, idl_vptr *ar**)
定義函式的格式是(加入你的函式名為func1)
static idl_vptr func1
(int argc, idl_vptr *ar**)
主要說明的是引數傳遞,ar**是從0開始為第乙個引數的,即ar**[0]並非儲存程式的名稱。
此外還需要做型別轉換:一是傳入引數的型別轉換,因為傳入的引數是標頭檔案idl_export.h
中定義的idl_vptr
型別,所以需要在標頭檔案中大概2000-3000行的位置找到型別轉換的函式,比如idl_vargetstring
用於將idl的string轉換為c的char,idl_doublescalar
用於將idl的double轉換為c的double。二則是類似的對於返回值的型別轉換。
定義完你的函式/過程之後,加上最後一段讓idl載入函式就大功告成了。
int
idl_load
(void),
};return
idl_sysrtnadd
(procedure_addr, false,
idl_carray_elts
(procedure_addr));
}
格式:
//載入函式
static idl_sysfun_def2 function_addr=
,};//載入過程
static idl_sysfun_def2 procedure_addr=,};
第六行開始的格式是
function 函式名 最少的引數個數 最多的引數個數
procedure 過程名 最少的引數個數 最多的引數個數
如果不想用idl提供的makefile,可以自己嘗試製作,其實主要分兩步(強迫症可以是3步),當然也可以把步驟寫入自己的makefile,方便一次性完成:
編譯為彙編檔案。編譯器一般為gcc或者cc(windows應該是clang.exe,命令為cl),-i
後面是額外標頭檔案的路徑,也就是idl_export.h
的位置,或者其他非系統庫函式的位置。此過程在目錄下生成模組.o
檔案。
gcc -i/usr/local/exelis/idl/external/include -c -fpic 模組.c
鏈結檔案。ld命令用於鏈結。此過程生成可用的模組.so
檔案。
ld -shared -bsymbolic --warn-once -noinhibit-exec -o 模組.so 模組.o
刪除不必要的.o檔案
rm 模組.o
生成動態鏈結庫(圖中由於已經製作好,所以未顯示任何命令)
開啟idl
dlm_register, 「dlm字尾的完整路徑」(必須先註冊dlm)
dlm_load, 「不帶路徑的模組名」(可以不用載入模組,呼叫函式時會自動載入)
使用函式/過程
!dlm_path
路徑下。
C語言 unix c 動態載入
動態載入 在程式中根據程式的需要,動態載入某個庫函式,這種行為稱為動態載入,系統為實現動態載入提供了一下函式 man 3 dlopen顯示幫助 標頭檔案 include void dlopen const char filename,int flag 引數 filename 制定了動態庫的檔案名字 ...
C 框架程式設計動態載入模組(一)
在之前分享的部落格中,我已經實現了乙個靜態載入的小框架,這個框架的模組已經在 中確定,一旦生成程式,模組將無法改變。但在實際應用的大型專案中,我們更傾向於使用動態載入模組的框架,這樣對於專案的移植更加靈活和方便,因此今天我就來實現這個效果,和大家一起分享。先看結果展示 大家看這個 是不是有種眼花繚亂...
編寫C語言開發環境 編譯模組
還有乙個問題是自動生成makefile,在linux下有autoconf及automake這兩個工具能實現,搜了一上午也沒找到win32版本的。只好放棄了makefile,直接用gcc的編譯,將所有的.c檔案全編譯成.o檔案,然後集中到乙個debug資料夾中,進行鏈結。這個開發環境是面向初學者的,沒...