dlc編譯器下載
㈠ dlfcn(dlopen, dlsym, dlclose)
在學習openGL 編譯時,用到glad, 提示缺少 libdl.so 的定義——即需要引入動態庫 libdl.so;所以順便了解一下 dlfcn;
作用:在運行時載入動態庫,獲取相應的動態庫函數,並進行執行; (類比cpython 和 pybind11 編譯的動態庫,在python 中可以直接 import 導入使用)
對比:編譯時直接指定動態庫和這種方法的區別?? 它們的主要特性相同,dlfcn 方法載入動態庫更加靈活;至於編譯、鏈接等更細操作不再深究;
參考: 【1】 LINUX下動態鏈接庫的使用(dlopen/dlsym/dlclose/dlerror)_#include -CSDN博客 【2】 dlopen/dlclsoe使用中的陷阱
【1】包含基礎用法;【2】多進程使用問題; 【1】其它收獲: - 二級指針配合函數指針使用; - 基於結構體,一次傳遞多個函數——聯想到LINUX 驅動中有類似的寫法; - -fPIC,-rdynamic 含義;
在dlopen 動態庫之後,使用 dlsym 載入相應的函數,即dlsym(handle, function_name) ;
如果使用g++編譯動態庫,編譯器會修改函數的名字,可以通過輸出相應的匯編文件確定,如下: g++ --std=c++11 -S cal.c -fPIC -shared
通過 extern "C" {} 包裹相應的代碼,告訴編譯器基於C語言的規則進行編譯,代碼如下:
動態庫載入之後,相當於同一作用域, 全局變數/函數是共享的,如果想要在動態庫中修改main.c 全局變數或者函數,需要在動態庫中使用extern進行聲明。 註:聲明可以多次,但定義只有一次
完整代碼如下:
g++ -std=c++11 -shared -fPIC -o libcal.so cal.c && g++ -std=c++11 -o main main.c -ldl -rdynamic