Makefile 先編譯出so 後在編譯出執行檔
#include <stdio.h>
int p = 2;
void print()
{
printf("This is the first dll src!\n");
}
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
void* pHandle;
void (*pFunc)(); /* 指向函式的指標 */
int* p;
pHandle = dlopen("./dl.so", RTLD_NOW); /* 開啟舊檔動態庫*/
if (!pHandle) {
printf("Cann't find dll.so\n");
exit(1);
}
*(void **)(&pFunc) = dlsym(pHandle, "print"); /* 獲取庫函式位址 */
if (pFunc) { /* 獲取庫函式物件 成功,執行庫函式 */
pFunc();
} else { /* 獲取庫函式物件 失敗,提示之 */
printf("Cann't find func print\n");
}
p = (int*) dlsym(pHandle, "p"); /* 獲取庫變數位址 */
if (p) { /* 獲取庫變數成功,使用之 */
printf("p=%d\n", *p);
} else { /* 獲取庫變數失敗,提示之 */
printf("Cann't find int p\n");
}
dlclose(pHandle); /* 關閉動態庫 */
return 0;
}
gcc -O -fPIC -shared -o dl.so d1.c && gcc -o tds tds.c -ldl
CC = gcc
all: dl.so
$(CC) -o main tds.c -ldl
dl.so:
$(CC) -O -fPIC -shared -o dl.so d1.c
.PHONY: clean
clean:
@rm -rf *.o *.so main