在 Linux 下,与 Windows 的 .lib
(静态库、导入库)和 .dll
(动态库) 对应的库文件类型如下:
Windows | Linux | 说明 |
---|---|---|
静态库 (.lib ) | 静态库 (.a ) | 静态链接库,编译时直接将代码合并到可执行文件中,不依赖外部库。 |
动态库 (.dll ) | 动态库 (.so ) | 共享库,运行时加载,多个程序可以共享,类似 Windows 的 .dll 。 |
导入库 (.lib ) | 不存在直接对应 | 在 Linux 下,不需要导入库,编译器/链接器可以直接链接 .so 文件。 |
1. 静态库在 Windows 和 Linux 下的对应
- Windows:静态库是
.lib
,它是多个.obj
文件(目标文件)的集合。 - Linux:静态库是
.a
(Archive Library),它是多个.o
文件(目标文件)的集合。
如何生成静态库
在 Linux 下,生成静态库(.a
)的方法:
gcc -c mylib.c -o mylib.o # 生成目标文件
ar rcs libmylib.a mylib.o # 生成静态库(libmylib.a)
在 Windows 下,类似的过程是:
cl /c mylib.c # 生成 .obj 文件
lib /out:mylib.lib mylib.obj # 生成静态库
2. 动态库在 Windows 和 Linux 下的对应
- Windows:动态库是
.dll
,运行时加载,不会直接链接到可执行文件中。 - Linux:动态库是
.so
(Shared Object),也不会直接链接到可执行文件中,而是运行时动态加载。
如何生成动态库
在 Linux 下,生成共享库(.so
)的方法:
gcc -fPIC -c mylib.c -o mylib.o # 生成位置无关代码(PIC)
gcc -shared -o libmylib.so mylib.o # 生成动态库(.so)
在 Windows 下,类似的过程是:
cl /LD mylib.c /Fe:mylib.dll # 生成动态库(.dll)
3. Windows 的“导入库”在 Linux 下的情况
在 Windows 下,.dll
不能直接被链接,因此需要一个 导入库 (.lib
) 来提供符号解析信息。
- Windows 需要:
.dll
(动态库).lib
(导入库).h
(头文件)
在 Linux 下,不需要导入库,.so
既可以在运行时动态加载,也可以在编译时直接链接:
gcc main.c -o main -L. -lmylib # 直接链接 .so 文件
所以,Linux 下 .so
既可以作为 Windows .dll
的等效物,也可以直接当成导入库使用,不像 Windows 需要单独的 .lib
。
4. Linux 下如何使用动态库
方法 1:编译时链接 .so
(类似 Windows 的导入库)
gcc main.c -o main -L. -lmylib # 直接链接 libmylib.so
运行时需要 .so
在 LD_LIBRARY_PATH
里:
export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./main
方法 2:运行时动态加载(类似 LoadLibrary()
)
在 Windows 下,你可以用 LoadLibrary()
加载 .dll
。
在 Linux 下,你可以用 dlopen()
加载 .so
:
#include <dlfcn.h>
void *handle = dlopen("libmylib.so", RTLD_LAZY);
5. 结论
Windows | Linux | 作用 |
---|---|---|
.lib (静态库) | .a (静态库) | 编译时链接,最终代码合并进可执行文件,不需要外部库。 |
.dll (动态库) | .so (动态库) | 运行时加载,可多个程序共享。 |
.lib (导入库) | 无直接对应,.so 直接用 | Linux 下 .so 既能运行时加载,也能编译时链接,不需要额外的 .lib 。 |
在 Windows 下,.lib
可能是静态库,也可能是导入库,而在 Linux 下:
- 静态库始终是
.a
。 - 动态库始终是
.so
,既可以直接链接,也可以运行时动态加载。