業務開發使用Go語言,有的時候會引用c的代碼,通常以靜態庫的形式調用,介紹一下linux平臺靜態庫的製作與使用方式:
HelloWorld庫代碼:
HelloWorld.c文件
/**
* 簡單靜態庫文件使用
*/
#include "HelloWorld.h"
/* 庫函數 */
void hello(void)
{
printf("Hello World \r\n");
return ;
}
HelloWorld.h文件
#include <stdio.h>
void hello(void);
靜態庫的Makefile:
# 靜態庫的使用例子
# 生成libhelloworld.a靜態庫
lib:
gcc -Wall -c HelloWorld.c
ar -crv libhelloworld.a HelloWorld.o
編寫測試程序調用靜態庫:
測試程序代碼:
/**
* 靜態庫的使用
*/
/* 引用靜態庫的頭文件 */
#include "HelloWorld.h"
int main(void)
{
/* 調用靜態庫函數 */
hello();
return 0;
}
編譯選項:
#-l選項後面跟上表示引用的庫名
#-L選項表示庫的搜索路徑
app:
gcc -Wall -o demoapp call_lib.c -L. -lhelloworld
運行截圖:
可能遇到的錯誤:
./libhelloworld.a: could not read symbols: Archive has no index; run ranlib to add one
collect2: ld 返回 1
原因可能是沒有引用靜態庫的頭文件或者靜態庫編譯有錯誤。