静态库:在链接步骤中,连接器将库文件取得所需的代码,复制到生成的可执行文件中,这种库叫做静态库,其特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。即静态库中的指令全部被直接包含在最终生成的exe文件中。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件。
动态库:动态库链接是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行的文件,动态库提供一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个DLL中,该DLL中包含一个或者多个已经被编译,链接并使用它们的进程分开存储的函数,在vs中新建生成动态库的工程,编译成功后,产生一个.lib和一个.dll文件。
静态库的lib:该lib包含函数的代码本身(包括函数的索引,也包括实现),在编译 的时候将代码加入程序当中
动态库的lib:该lib包含了函数所在的DLL文件和文件中函数位置的信息,函数实现代码由运行的时候加载在进程空间中DLL提供,总之,lib是编译的时候用到的,如果完成源代码的编译,只需要lib,如果要使得动态库的程序运行起来,只需要dll。
静态库.a(win下是lib) 和动态库.so(win下是.dll),所谓静态,动态是指链接,回顾下,将一个程序编译成可执行的步骤:
静态库在程序编译的时候会被链接到目标代码中,程序运行的时候不需要该静态库。
静态库特点:
静态库对函数库的链接是放在编译期完成的,程序在运行的时候与函数库再无瓜葛,移植方便。
缺点:浪费空间与资源,因为所有相关的目标文件与牵扯到的函数库会被合成一个可执行的文件。
是静态库对程序的更新,部署和发布会带来麻烦,如果静态库更新,所有使用它的应用程序程序都需要重新编译,发布给用户。
动态库特点:
动态库把一些库函数的链接载入推迟到程序运行的时期,可以实现进程之间的资源共享。
将实现进程之间的资源共享,将一些程序升级变得简单。甚至可以真正做到链接载入完全由程序代码中控制(显示调用)
gcc -o 与gcc -c的区别,gcc -o是将.c源文件编译成一个可执行的二进制代码,这包括调用GCC内的一部分真正的C编译器,以及调用GNU C编译器的输出中实际可执行的代码的外部GNU汇编器和链接工具,而-c是使用GNU汇编器将源文件转换为目标代码之后就结束,在这种情况下连接器并没有被执行,所以输出的目标文件不会包含作为linux程序在被装载和执行的时候所必须的信息。
linux 动态库的命名与制作:
动态链接库的名字形式为 libxxx.so,前缀是lib,后缀名为.so
创建动态库.so可以分为两步:
第一步:生成目标文件,此时要加编译器选项 -fPIC.[ps: -fPIC是创建与地址无关的编译器程序,是为了能够在多个应用程序之间共享]
第二步:生成动态库,此时要加连接器选项-shared。[ps: -shared是指定生成动态链接库]
最终会得到动态链接库.so文件
使用动态链接库
引用动态链接库,和静态库一样,在编译的时候制定动态链接库就好
gcc main.c -L. -lmyhello.
-L. 代表动态库在当前路径下; -l后跟的是动态链接库的名字。和静态一样,可以舍去前缀(lib和后缀.so)
参考:https://blog.csdn.net/qq_39584315/article/details/80311454
实战
简单的接口:
max.h:
#ifndef MAX_H_
#define MAX_H_
#ifdef _cplusplus
extern "C"
{
#endif
int max(int a, int b);
#ifdef cplusplus
}
/* code */
#endif //_cplusplus
#endif //MAX_H_
max.cpp
#include "max.h"
#include <iostream>
int max(int a, int b)
{
return a > b ? a : b;
}
然后在此处写CMakeLists.txt
SET(LIBMAX_SRC max.cpp)
ADD_LIBRARY(max SHARED ${LIBMAX_SRC})
然后cmake .
make就能得到.so
然后编写main.cpp 也就是调用接口的。
#include <iostream>
#include "max.h"
int main(int argc, char const *argv[])
{
std::cout<<"max: "<<max(2,3)<<std::endl;
return 0;
}
然后再编写一个CMAKE
# 设置cmake的最小版本
cmake_minimum_required(VERSION 2.8.8)
# 项目名称
project(main)
# 设置C++编译器,设置变量路径
set(CMAKE_CXX_STANDARD 11)
# 项目中的include路径
include_directories(lib)
# 项目中的lib路径
link_directories(lib)
add_executable(main main.cpp)
#链接libmax.so
target_link_libraries(main max)
然后编译:
cmake ..
make
就能得到结果