C語言編寫IDL動態可載入模組 DLM 入門

2021-10-04 21:13:39 字數 2378 閱讀 7002

harris對於dlm的官方說明

乙個第三方的dlm,用於參考學習

另乙個講dlm的csdn部落格,但個人覺得太複雜了

安裝路徑下該資料夾中所有檔案:/idl/external/dlm/*

安裝路徑下該依賴項標頭檔案:/idl/external/include/idl_export.h

其實不管是示例的testmodule還是另一篇部落格裡面都有好些不需要的,我做了很大的精簡。

首先要把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資料夾中,進行鏈結。這個開發環境是面向初學者的,沒...