如何将代码编译为静态库、动态库

545 阅读2分钟

这是我参与更文挑战的第9天,活动详情查看:更文挑战

什么是静态库与动态库

什么是库?

在早期时代,一般使用C语言开发程序,很多的程序都会用到相同基础功能的函数库。为了方便开发就把经常用到的底层的基础函数封闭成库,库是写好的现有的,成熟的,可以复用的代码。

本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。于是就有了C运行时库(C Runtime Library),也就是静态库libc.lib(Release版)、libcd.lib(Debug版)。这样多个程序使用C标准库时内存中就只有一份拷贝了。

静态库与动态库

简单的理解,如果有dll一般就是动态编译,它同时LIB文件,DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

静态编译中,则一般lib文件,这个lib文件是静态编译出来的,索引和实现都在其中。

下面使用xmake进行静态库和动态库的编译

静态库和动态库的编译

参考xmake的官方博客[静态库和动态库的编译切换](静态库和动态库的编译切换 (tboox.org))

设置xmake.lua为

add_rules("mode.debug", "mode.release")

target("hell")
    set_kind("binary")

    set_kind("$(kind)")//若不指定参数,则将自动同时生成dll
    add_files("src/*.cpp")

在powershell下进行如下操作

PS D:\Project\CPP> xmake create -l c++ -P ./hell 
create hell ...
  [+]: src\main.cpp
  [+]: .gitignore
create ok!
PS D:\Project\CPP> cd .\hell\
PS D:\Project\CPP\hell> xmake
checking for platform ... windows
checking for architecture ... x64
checking for Microsoft Visual Studio (x64) version ... 2019
PS D:\Project\CPP\hell> xmake
checking for platform ... windows
[ 50%]: archiving.release hell.lib
[100%]: build ok!                                      2019

PS D:\Project\CPP\hell> xmake f -k shared
checking for platform ... windows
checking for architecture ... x64
checking for Microsoft Visual Studio (x64) version ... 2019
PS D:\Project\CPP\hell> xmake
[ 50%]: linking.release hell.dll
[100%]: build ok!

PS D:\Project\CPP\hell> tree .\build\
Folder PATH listing for volume 其他软件
Volume serial number is 000000EC C4E8:1E9C
D:\PROJECT\CPP\HELL\BUILD
├───.deps
│   └───hell
│       └───windows
│           └───x64
│               └───release
│                   └───src
├───.objs
│   └───hell
│       └───windows
│           └───x64
│               └───release
│                   └───src
└───windows
    └───x64
        └───release

image.png