为什么要静态编译

部署程序的时候经常需要编译成纯静态的二进制文件。

相比动态链接,好处是很明显的:

  1. 无需依赖,在linux平台上畅通无阻,无需在环境中部署所需的动态库
  2. 执行速度更快?

但也有一些坏处:

  1. 内存占用较大
  2. 文件体积较大
  3. 可维护性较差,当库的版本更新后,需要重新编译发布,而不是像动态链接一样直接替换动态库文件

是否需要静态编译就看自己的取舍吧~

如何静态编译

cmake_minimum_required(VERSION 2.8)
project(static_linking_test)

# 静态链接
set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc")

# 搜索当前文件夹下所有的cpp文件
file(GLOB SRC *.cpp)

# 以boost为例,设置使用boost的静态库
set(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED system thread filesystem timer chrono
    program_options)

include_directories(${Boost_INCLUDE_DIRS})

add_executable(static_linking_test ${SRC})

set_target_properties(static_linking_test PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(static_linking_test PROPERTIES LINK_SEARCH_END_STATIC 1)

# 链接所需要的静态库
target_link_libraries(static_linking_test -static
    ${Boost_LIBRARIES}
    zlib
    pthread
    rt
    )

通常需要安装开发环境的各个静态库,第三方库就需要自己编译或是使用别人编译好的。libc库就需要自己安装了。

如:

# centos
sudo yum install glibc-static

# ubuntu
sudo apt-get install libc6-dev

测试静态链接

编译:

cmake .
make

测试:

ldd static_linking_test
# 输出not a dynamic executable即为成功
Last modification:August 16, 2018
If you think my article is useful to you, please feel free to appreciate