C語言動態庫libxxx.so的幾種使用方法
首先先編寫一個簡單的函式func.h func.c
func.h
#ifndef _FUNC_H
#define _FUNC_H
#include <stdio.h>
#include <stdlib.h>
void fun(char *str);
#endif
func.c
#include <func.h>
void fun(char *str)
{
printf("%s\n", str);
}
將這個函式編譯成動態庫
$ gcc func.c -I . -shared -fPIC -o libfunc.so
$ ls
func.c* func.h* libfunc.so* main.c*
編寫main.c程式
#include <func.h>
int main(int argc, char *argv[])
{
fun("Hello World!\n");
return 0;
}
編譯方法一:
$ gcc main.c -I . ./libfunc.so
$ ./a.exe
Hello World!
檢視可執行檔案依賴:
$ ldd a.exe
ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x77d20000)
KERNEL32.DLL => /cygdrive/c/Windows/System32/KERNEL32.DLL (0x779b0000)
KERNEL32.DLL => /cygdrive/c/Windows/System32/KERNEL32.DLL (0x779b0000)
KERNELBASE.dll => /cygdrive/c/Windows/System32/KERNELBASE.dll (0x74e40000)
libfunc.so => /home/rongtao/libfunc.so (0x690c0000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
裡面依賴的dll檔案是因為我用的cywin,是windows下面的Linux模擬軟體,所以會用到,我們主要關注這個libfunc.so庫檔案,關注它後面的路徑,可以看到這個地方的路徑即為編譯時的路徑。
我們再看看這個動態庫內部的函式關係:
$ nm libfunc.so | grep T --color=auto
690c1690 T ___CTOR_LIST__
690c1104 T ___cxa_atexit
690c169c T ___DTOR_LIST__
690c10c0 T ___gcc_deregister_frame
690c1000 T ___gcc_register_frame
690c3264 R ___RUNTIME_PSEUDO_RELOC_LIST__
690c3264 R ___RUNTIME_PSEUDO_RELOC_LIST_END__
690c1690 T __CTOR_LIST__
690c12d0 T __cygwin_crt0_common@8
690c1150 T __cygwin_dll_entry@12
690c1250 T __cygwin_noncygwin_dll_entry@12
nm指令是檢視庫檔案的宣告、未宣告的函式等作用。在程式設計過程中我們經常會遇到“未引用的定義”,這個其實就可以用nm命令檢視。在這裡我想說個題外話,訊息佇列的庫是“-lrt”,之前編譯的N多變沒通過的原因就是沒加這個庫。
編譯方法二:
如果我們把這個檔案家內的libfunc.so檔案刪除,再執行可執行檔案會出現如下錯誤:
$ ls
a.exe* func.c* func.h* main.c*
$ ./a.exe
D:/Program Files (x86)/cygwin/home/rongtao/a.exe: error while loading shared libraries: libfunc.so: cannot open shared object file: No such file or directory
無法載入動態庫檔案。
這裡我用的cywin,所以說和一般的Linux系統不一樣,沒法演示,具體流程是:
如果系統是x86_64的,那麼在/usr/lib64資料夾下為系統庫,這個庫是可以直接呼叫的(例如我們的-lm, -pthread,-lrt等),如果我們將動態庫檔案放到這個資料夾下就可以直接用“-lfunc”來呼叫。此處不做過多講解。
相關文章
- C語言動態呼叫庫(轉)C語言
- 深入理解C語言----動態庫 & 靜態庫 & 連結C語言
- C語言的本質(34)——靜態庫C語言
- C語言動態走迷宮C語言
- Golang語言排序的幾種方式Golang排序
- C語言(動態記憶體分配)C語言記憶體
- C語言_指標和陣列的幾種訪問形式C語言指標陣列
- C語言實現字串拷貝函式的幾種方法C語言字串函式
- 動態ip代理的三種使用方法
- 幾種常用程式語言的區別
- 幾種程式語言的優缺點
- 在我眼裡的幾種語言
- C語言動態陣列小作業C語言陣列
- C語言:一種高效、易學的程式語言C語言
- C語言——幾道習題C語言
- C語言的幾個關鍵字C語言
- Python 語言特性:編譯+解釋、動態型別語言、動態語言Python編譯型別
- 幾種計算機語言的評價計算機
- C語言編寫靜態連結庫及其使用C語言
- C語言學習的幾個階段C語言
- C語言函式手冊:c語言庫函式大全|C語言標準函式庫|c語言常用函式查詢C語言函式
- C語言基礎——%X(十六進位制)的幾種不同輸出格式C語言
- ASP程式中常使用的幾種指令碼語言指令碼
- 幾十種程式語言的快速入門教程
- 理解Javascript的動態語言特性JavaScript
- Python是一種物件導向的動態型別語言Python物件型別
- 為什麼《七週七語言》選中的是這幾種語言?
- - C語言標準庫C語言
- 有幾點關於C語言的疑問C語言
- C語言高效程式設計的幾招(轉)C語言程式設計
- Swift 幾種動態判斷類的方法Swift
- jQuery動態生成html元素的幾種方法jQueryHTML
- Scala: 感覺像動態的靜態語言
- C語言-srand種子詳解C語言
- 用C語言實現有限狀態自動機FSMC語言
- C語言的本質(35)——共享庫C語言
- tmpnam() - C語言庫函式C語言函式
- tmpfile() - C語言庫函式C語言函式