<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
為了是不同的邏輯解耦,一般會把各個業務封裝成動態庫,然後主邏輯去呼叫各個外掛。這裡有個問題是,為什麼以前我們都是通過include第三方的標頭檔案,然後通過聯結器實現,現在卻要利用dlopen呢?考慮以下情況,比如我們要用cublas這個庫的sgemm函數。
#include "cublas.h" int main() { cublas:: Mat a, b; cublas::sgemm(a,b); }
我們知道cublas是英偉達提供的,人家每年都要更新動態庫的,比如今年更新後,動態庫的標頭檔案改了cublas_v2.h, 函數名改為sgemm_v2, 這樣一頓操作後,你不僅要升級庫,也要修改已經上線的程式碼,假如這個sgemm函數在你原始碼中出現了n多次,這將是一個災難。但是通過下面的方式你就可以避免這個問題:
// func.h #include <stdio.h> #include <stdlib.h> #include <cublas_v2.h> // 如果你知道確切的函數返回資訊,這個對應下面的cublas_func可以自己寫。 #include <dlfcn.h> extern std::once_flag cublas_dso_flag; extern void *cublas_dso_handle; struct DynLoad__add { template <typename... Args> inline auto operator()(Args... args) -> DECLARE_TYPE(add, args...) { using cublas_func = decltype(::add(std::declval<Args>()...)) (*)(Args...); std::call_once(cublas_dso_flag, []() { cublas_dso_handle = dlopen("./libcublas.so", RTLD_LAZY); }); static void *p_add = dlsym(cublas_dso_handle, "add"); return reinterpret_cast<cublas_func>(p_add)(args...); } }; extern DynLoad__add add; // func.c DynLoad__add add; // main.cc #include <stdio.h> #include <stdlib.h> #include "func.h" int main() { add(2,7)); } 根據上面的程式碼可以看到,只要你每次修改func.h檔案的動態庫路勁和函數名就可以了,其他用到的add函數根本不需要再去修改。真是很方便,上面的程式碼參考paddle的原始碼:paddle/fluid/platform/dynload/cublas.h
int add(int a,int b) { return (a + b); } int sub(int a, int b) { return (a - b); }
gcc -fPIC -shared caculate.c -o libcaculate.so
#include <dlfcn.h> void *dlopen(const char *filename, int flag); char *dlerror(void); void *dlsym(void *handle, const char *symbol); int dlclose(void *handle);
dlopen是載入動態連結庫,flag可以設定不同的模式(RTLD_LAZY 暫緩決定,等有需要時再解出符號, RTLD_NOW 立即決定,返回前解除所有未決定的符號。), dlopen可以返回動態庫的控制程式碼,dlsym是獲取動態庫中的具體函數名或者變數名。dlopen是關閉動態庫。
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> typedef int (*FUNC)(int, int); int main() { void *handle; char *error; FUNC func = NULL; //開啟動態連結庫 handle = dlopen("./libcaculate.so", RTLD_LAZY); //獲取一個函數 *(void **) (&func) = dlsym(handle, "add"); printf("add: %dn", (*func)(2,7)); //關閉動態連結庫 dlclose(handle); }
gcc -rdynamic -o main main.c -ldl
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45