记录 | linux静态库和动态库的理解
hello.cpp
:
#include <cstdio>
void hello() {
printf("Hello, world!\n");
}
main.cpp
:
#include <cstdio>
void hello();
int main() {
hello();
return 0;
}
静态库编译配置:
cmake_minimum_required(VERSION 3.12)
project(hellocmake LANGUAGES CXX)
add_library(hellolib STATIC hello.cpp)
add_executable(a.out main.cpp)
target_link_libraries(a.out PUBLIC hellolib)
动态库编译配置:
cmake_minimum_required(VERSION 3.12)
project(hellocmake LANGUAGES CXX)
add_library(hellolib SHARED hello.cpp)
add_executable(a.out main.cpp)
target_link_libraries(a.out PUBLIC hellolib)
编译:
cmake -B build
cd build
make
反汇编:
objdump -d a.out | less
可以看到静态库编译是把实现写在了可执行程序里面了,而动态库编译是跳转到了动态库,所以执行的时候,如果是静态库编译,则可以抛开.a
;而动态库编译的话,就必须要链接动态库。
所以也是为什么静态库编译的执行程序会比动态库编译的要大的原因了。