简介在软件开发中,动态库(Shared Library)是一种常见的资源共享方式,它允许程序在运行时加载和链接外部代码模块。C语言因其高性能和灵活性,经常被用来编写动态库。.so文件是Linux系统中...
在软件开发中,动态库(Shared Library)是一种常见的资源共享方式,它允许程序在运行时加载和链接外部代码模块。C语言因其高性能和灵活性,经常被用来编写动态库。.so文件是Linux系统中常见的动态库文件格式。本文将详细介绍如何在C语言中创建.so动态库,并探讨如何实现高效跨平台调用。
首先,需要编写C语言的源代码文件和对应的头文件。以下是一个简单的例子:
add.h
#ifndef ADD_H
#define ADD_H
int add(int a, int b);
#endif // ADD_Hadd.c
#include "add.h"
int add(int a, int b) { return a + b;
}使用C编译器将源代码编译成目标文件(.o文件)。在Linux系统上,可以使用以下命令:
gcc -c add.c -o add.o使用gcc命令,将目标文件链接生成动态库。在Linux系统上,可以使用以下命令:
gcc -shared -fPIC -o libadd.so add.o这里,-fPIC选项用于生成位置无关代码,这对于动态库是必需的。
编写一个调用动态库的程序。以下是一个简单的例子:
main.c
#include
#include "add.h"
int main() { int result = add(5, 3); printf("Result: %d\n", result); return 0;
} 编译调用程序,确保链接到动态库:
gcc -o main main.c -L. -ladd这里,-L.指示编译器在当前目录搜索库文件,-ladd指示链接名为add的库。
为了实现跨平台调用,需要为不同平台编译动态库和调用程序。以下是在Windows上创建DLL的示例:
add.c
#include "add.h"
#include
int add(int a, int b) { return a + b;
} add.def
LIBRARY "add"
EXPORTS add编译命令
gcc -shared -o add.dll add.c -o add.def在调用程序中,使用相应的库文件。例如,在Windows上,使用.dll文件:
main.c
#include
#include "add.h"
int main() { HINSTANCE hLib = LoadLibrary("add.dll"); if (hLib == NULL) { printf("Failed to load library.\n"); return 1; } FARPROC pFunc = GetProcAddress(hLib, "add"); if (pFunc == NULL) { printf("Failed to get function address.\n"); FreeLibrary(hLib); return 1; } int (*addFunc)(int, int) = (int (*)(int, int))pFunc; int result = addFunc(5, 3); printf("Result: %d\n", result); FreeLibrary(hLib); return 0;
} 编译命令
gcc -o main main.c -L. -ladd通过以上步骤,可以在不同平台上创建和调用C语言动态库,实现高效跨平台调用。