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

记录 | linux静态库和动态库的理解_编译


反汇编:

objdump -d a.out | less

记录 | linux静态库和动态库的理解_编译_02


可以看到静态库编译是把实现写在了可执行程序里面了,而动态库编译是跳转到了动态库,所以执行的时候,如果是静态库编译,则可以抛开.a;而动态库编译的话,就必须要链接动态库。

所以也是为什么静态库编译的执行程序会比动态库编译的要大的原因了